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注解:

  1. @Bean
  2. @LoadBalanced
  3. public RestTemplate restTemplate() {
  4. return new RestTemplate();
  5. }

修改consumer-demo\src\main\java\com\itheima\consumer\controller\Consumercontroller.java调用方式,不再手动获取ip和端口,而是直接通过服务名称调用

  1. @GetMapping("[id]")
  2. public User queryById(@Pathvariable("id") Long id) {
  3. String url = "http://user-service/user/" + id;
  4. User user = restTemplate.getForobject(url, User.class) ;
  5. return user;
  6. }

访问页面,查看结果。并可以在9091和9092的控制台查看执行情况:

了解: Ribbon默认的负载均衡策略是轮询。SpringBoot也帮提供了修改负载均衡规则的配置入口在consumer-demo的配置文件中添加如下,就变成随机的了:

  1. user-service:
  2. ribbon:
  3. 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。