Eureka中已经集成了负载均衡组件:Ribbon,简单修改代码即可使用。
一、Ribbon简介
Ribbon是Netflix 发布的负载均衡器,它有助于控制HTTP和TCP客户端的行为。为Ribbon配置服务提供者地址列表后,Ribbon 就可基于某种负载均衡算法,自动地帮助.
服务消费者去请求。Ribbon 默认为我们提供了很多的负载均衡算法,例如轮询、随机
等。当然,我们也可为Ribbon实现自定义的负载均衡算法。
因为Eureka中已经集成了Ribbon,所以我们无需引入新的依赖。
直接修改consumer-demo\src\main\java\com\itheima\consumer\ConsumerApplication.java
在RestTemplate的配置方法上添加@LoadBalanced注解:
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
修改consumer-demo\src\main\java\com\itheima\consumer\controller\Consumercontroller.java调用方式,不再手动获取ip和端口,而是直接通过服务名称调用:
@GetMapping("[id]")
public User queryById(@Pathvariable("id") Long id) {
String url = "http://user-service/user/" + id;
User user = restTemplate.getForobject(url, User.class) ;
return user;
}
访问页面,查看结果。并可以在9091和9092的控制台查看执行情况:
了解: Ribbon默认的负载均衡策略是轮询。SpringBoot也帮提供了修改负载均衡规则的配置入口在consumer-demo的配置文件中添加如下,就变成随机的了:
user-service:
ribbon:
NFLoadBalancerRuleclassName: com.netflix.loadbalancer.RandomRule
格式是: {服务名称}.ribbon.NFLoadBalancerRuleClassName
二、源码跟踪
为什么只输入了service名称就可以访问了呢?之前还要获取ip和端口。显然是有组件根据service名称,获取到了服务实例的ip和端口。因为consumer-demo
使用的是RestTemplate。
spring的负载均衡自动配置类LoadBalancerAutoConfiguration.LoadBalancerInterceptorconfig
会自动配置负载均衡拦截器(在spring-cloud-commons-**.jar包中的spring.factories中定义的自动配置类) ,它就是LoadBalancerInterceptor
,这个类会在对RestTemplate的请求进行拦截,然后从Eureka根据服务id获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id。