Ribbon的工作
ribbon是用来进行客户端负载均衡的工具,client从eurekaServer将所有的服务信息拉取到本地,然后ribbon根据role来选择调用的client。发现很多新入手的同学容易把ribbon和RestTemplete搞混,大家需要理解ribbon只是一个选择器,他只是帮助RestTemplete选择调用的节点而已,真正调用服务的还是RestTemplate。
ribbon调用图解
更正下上图的错误 我们缓存map是在com.netflix.discovery.shared.Applications里 错误写成Application了。
上面的图解是直接使用restTempate进行请求,需要主要注意的是我们的RestTemplate需要 @LoadBalanced进行修饰,这样才会调用到我们的LoadBalance拦截器。
@Autowired
RestTemplate restTemplate;
@Bean
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder){
return restTemplateBuilder.build();
}
ribbon中有四个对象比较重要:
- ILoadBalancer。这个就是我们使用的lb,通过自定义lb的规则可以选择出来我们可以调用的一组服务器地址。例如ZoneAwareLoadBalancer,这个lb会选择出来最合适的zone,假如北京一个机房、上海一个机房,而你正好在北京调用的话会优先选择北京地区的一组服务。
- IRule。从名字看来他就是一个“rule”,用来从lb中选择一个合适的服务进行调用,主要不要跟lb弄混了。lb是从整个eureka中选择一组服务,rule再从这一组服务中进行选择。
- ServerListUpdater。服务列表更新器,默认实现是DynamicServerListLoadBalancer,每隔一段时间便会更新一下lb中的serverList。
- IPing。主要是定义了我们使用什么规则进行ping操作,来检查服务的存活。我们不仅可以用它来检验服务存活,可以扩展的记录服务的响应时间用来做权重,从而做自定义的rule。
当然以上四类都可以自定义替换。规则如下:
- clientName.ribbon.NFLoadBalancerClassName: 需要实现 ILoadBalancer
- clientName.ribbon.NFLoadBalancerRuleClassName: 需要实现IRule
- clientName.ribbon.NFLoadBalancerPingClassName:需要实现 IPing
- clientName.ribbon.NIWSServerListClassName: 需要实现 ServerList
clientName就是我们的服务名称,例如我们可以像下面这样配置yaml格式
users:
ribbon:
NIWSServerListClassName: com.netflix.loadbalancer.ConfigurationBasedServerList
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
图的右半部分是介绍服务更新。其中有个比较注意的点是客户端的二级缓存,这可能会导致我们的服务上下线存在延迟,因为我们需要二级缓存都同步以后才能知道哪些服务是UP哪些服务是DOWN。
Eureka Server
-> Eureka Client
-> LoadBalancer
首先eureka client从eureka server中拉取到现在UP的服务,然后再把对应的拉取到的数据更新到LoadBalancer中。
有关两个定时的配置:
# ribbon更新loadbalancer的间隔 但是毫秒
ribbon.ServerListRefreshInterval=500
# 从eureka server拉取列表的间隔 默认是秒
eureka.client.registry-fetch-interval-seconds=300