Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。
Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。
它们之间的关系像是:
客户端发送某个查询请求,先通过nginx反向代理,nginx采用负载均衡到后台某一指定服务器接口但是该服务器接口业务逻辑的实现依赖于其他服务,因此内部还需要远程调用其他服务。
由因为需要被远程调用的服务也是集群模式,因此需要本地负载均衡。
而ribbon就是本地负载均衡的客户端工具。
Nacos、Eureka这些注册中心内部都内置了Ribbon,因此不需要我们额外引入依赖。
我们可以通过RestTemplate、OpenFeign等工具实现远程调用。
而OpenFeign自带负载均衡配置项,不需要再单独配置。
但是RestTemplate需要加上@LoadBalanced注解来完成远程调用的负载均衡。
Nacos中集成了Ribbon,可以实现本地负载均衡。也即是我们RestTemplate进行远程调用某一集群服务的时候,就可以实现轮询。前提是RestTemplate的bean对象必须添加@LoadBalanced注解,赋予RestTemplate负载均衡的能力,负载均衡才可以。
当然了,远程调用,我们除了使用RestTemplate,也可以使用OpenFeign的方式。
举例说明:
sms系统,我们模拟两台,都注册到nacos注册中心上去。我们提供了被调用的测试接口为:/test1
同样需要加入到nacos注册中心,
然后我们通过springmvc提供的RestTemplate进行远程调用刚才sms系统提供的/test接口。
使用restTemplate,我们最好将他创建为单例bean。因为被远程调用的服务是集群,所以必须@LoadBalanced注解。
我们直接通过访问pps服务的/pps/ok接口,看看是否能调用到sms系统的/test接口
可以,而且是轮询的在调用。
如果不想使用RestTemplate,也可以使用OpenFeign进行远程调用。
使用OpenFeign,则需要引入相关的依赖
主启动类需要加上@EnableFeignClients注解
然后远程调用接口
编写测试方法测试
成功,以上两种方式进行远程调用,都可以实现负载均衡~
当然除了这些,HttpClient也可以实现远程调用,Java自带的HttpUrlConnection也可以。至于它们能否实现对集群的访问,这里就不研究了。