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,

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

ribbon默认是采用轮询的负载均衡策略
RibbonLoadBalancerClient.class 源码中有获取服务实例的代码
public 测试一下查看效果
@SpringBootTest
最终我们可以看到ribbon轮询进行负载均衡的效果

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

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

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

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