1、restTemplate 是 Spring Resources 中一个访问第三方 API 接口的网络请求框架,用来消费REST 服务的
2、ribbon 作为服务消费者的负载均衡器,有两种使用 方式
1)ribbon和restTemplate 相结合
2)ribbon和feign相结合,feign已经默认集成了 ribbon
3、负载均衡器的核心类LoadBalancerClient
LoadBalancerClient 的 choose(”eureka-client'’)方法可以轮流得到 eureka-client 的两个 服务实例的信息。
@Autowired
private LoadBalancerClient loadBalancer;
@GetMapping (”/ testRibbon”)
public String testRibbon () {
Serviceinstance instance = loadBalancer.choose (”eureka client");
return instance . getHost ()+”:”+i nstance . getPor t ();
}
}
4、ribbon获取服务来源
1)从 Eureka Client获取获取服务的实例列表
ribbon会默认从 Eureka Client 的服务注册列表中获取服务的信息,并缓存一份。
根据缓存的服务注册列表信息,可以通过 LoadBalancerClient 来选择不同的服务实例, 从而实现负载均衡
2)从自己维护的列表中获取服务的实例
如果禁止 ribbon从 Eureka 获取注册列表信息,则需要自己去维护一份服 务注册列表信息
stores :
ribbon:
listOfServers : exarnple . corn, google. corn
ribbon :
eureka :
enabled: false
5、ribbon源码
1)ServiceInstanceChooser ---->ServiceInstance choose(String serviceId);
2)RibbonLoadBalancerClient----->ServiceInstance choose(String serviceId)---->Server getServer(ILoadBalancer loadBalancer)
3)ILoadBalancer---->Server chooseServer(Object var1)
4)DynamicServerListLoadBalancer---->Server chooseServer(Object var1)
5)IRule ------> Server choose(Object key)
BestAvailableRule: 选择最小请求数。
ClientConfigEnabledRoundRobinRule:轮询。
RandornRule: 随机选择一个 server。
RoundRobinRule: 轮询选择 server。
ReRule: 根据轮询的方式重试。
WeightedResponseTirneRule: 根据响应时间去分配一个 weight , weight 越低,被选 择的可能性就越低。
ZoneAvoidanceRule:根据 server 的 zone 区域和可用性来轮询选
6、 ribbon 的负载均衡主要是通过 LoadBalancerClient 来实现的,而 LoadBalancerClient 具体交给了 ILoadBalancer 来处理, ILoadBalancer 通过配置 !Rule、 !Ping 等,向 EurekaClient 获取注册列表的信息,默认每 10 秒向 EurekaClient 发送一次“ping”, 进而检查是否需要更新 服务的注册列表信息。最后,在得到服务注册列表信息后, ILoadBalancer 根据!Rule 的策略进 行负载均衡。 而 RestTemplate 加上@LoadBalance 注解后,在远程调度时能够负载均衡, 主要是维护了 一个被@LoadBalance 注解的 RestTemplate 列表,并给该列表中的 RestTemplate 对象添加了拦 截器。在拦截器的方法中,将远程调度方法交给了 Ribbon 的负载均衡器 LoadBalancerClient 去处理,从而达到了负载均衡的目