ribbon 默认负载均衡 是什么_SpringCloud(3):使用Ribbon进行负载均衡配置,以及遇坑指南...

Ribbon

因为Eureka中已经集成了Ribbon,所以我们无需引入新的依赖

启动多个服务提供方,在服务消费方开启ribbon使用负载均衡 @LoadBalanced

在消费方的启动类中的RestTemplate方法上使用@LoadBalanced注解

@Bean

开启ribbon负载均衡后,就可以使用服务名来调用提供方的服务,

this

服务方根据负载均衡器来选择合适的服务实例。

在前面的代码中,我们在消费方,使用了DiscoveryClient 来获取提供方的的服务列表

private 

进而可以通过服务列表指定某一个服务实例,进而指定主机和端口

ServiceInstance 

而使用负载均衡后,我们需要以一定的规则让系统自动选择合适的服务实例,而不是人工指定。

注意:

1、开启@LoadBalanced后,不能直接访问提供方的具体主机名和端口号,否则报错 java.lang.IllegalStateException: No instances available for localhost

2、服务名不要使用下划线,否则报错 Request URI does not contain a valid hostname: http://service_provider/user/42

最终我们在消费方的控制器使用以下代码就可以实现远程服务调用(负载均衡)

@Controller

在LoadBalancerInterceptor.class的源码中,我们可以看到调用的uri中还是service-provider,

e31ad48a15ae8d1857645cddb20ea341.png

执行进入RibbonLoadBalancerClient.class时,Ribbon以默认方式分配了具体的服务实例。

78000bb3f214c5c0295cac454328c2f7.png

ribbon默认是采用轮询的负载均衡策略

RibbonLoadBalancerClient.class 源码中有获取服务实例的代码

public 

测试一下查看效果

@SpringBootTest

最终我们可以看到ribbon轮询进行负载均衡的效果

3b7129fb6a19f7d4ca086be1e814d92e.png

通过源码,RibbonLoadBalancerClient-->ZoneAwareLoadBalancer-->BaseLoadBalancer 找到负载均衡选择服务器的规则代码:

e3fac011fc624ac2089da45910cf0f1c.png

chooseServer()方法中调用了rule,rule是一个接口,BaseLoadBalancer 中的 DEFAULT_RULE = new RoundRobinRule(); 即轮询负载均衡。

41ca5eae919d290bedadf7ca48ab7f71.png

除了轮询策略外,还有随机策略,可以在消费方的配置文件中指定。

84e09400b0bdbe2eef3b7032294151f1.png
service

然后重新运行测试用例,发现已变为随机

210f6849ad3ce87cda7f790632224f7b.png