Ribbon工作原理

1.ILoadBalancer 负载均衡器,基于IRule 接口实现负载均衡算法,在这个接口里可以自定义负载均衡算法

Class MyRule Implements IRule{

}

来实现特定的规则往特定的服务上分发

很少需要定制负载均衡算法,除非是hash分发的那种场景,不过分布式系统中尽量减少hash分发情况

2.Ribbon内置服务站均衡规则

1)RoundRobinRule:系统内置的默认负载均衡,直接轮训

2)AvailabilityFilteringRule :这个rule会考察服务器性能

3)带权重的规则,如果某个服务器响应时间长,权重降低,减少访问

4)ZoneAvoidanceRule:根据区域或服务器进行负载均衡,就是基于机房的

5)BastAvaiable:忽略连接失败的服务器,尽量找到并发低的服务器来请求

6)RandomRule:随机找一个服务器

3. ribbon里定时ping服务器的接口

@LoadBalanced注解

这个注解的意思是,将一个RestTemplate 标志位底层采用LoandBalancerClient来执行实际的HTTP请求

支持负载均衡

AsynLoadBalancerAutoConfiguration 带有Asyn 的可以猜想到时异步调用,可能根本没用到

LoadBalancerAutoConfiguration :专门为Ribbon 搞得一个配置类

RestTemplateCustomizer : 专门对RestTemplate 进行定制化的一个组件

内置RestTemplate 拦截器insterceptor拦截器。里边有一些Retry的代码,就是对RestTemplate 调用

重试

Ribbon 负载均衡原理

ribbon 需要配合Eureka一起使用,从Eureka中拿到服务器列表,然后基于服务器列表调用

通过RestTemplate 请求对应的服务器

RestTemplate 并不是直接调用接口,而是被LoadBalancerInterceptor 拦截,进行接口处理

然后由拦截器发起请求

LoadBalancerInterceptor 拦截器原理

 

实际上拦截器会把请求交给LoadBalancerClient,去执行实际的请求,LoadBalancerClient 通过@Ben 方法传到LoanBalancerAutoConfiguration

里面,RestTemplate由LoadBalancerClent.execute()方法执行调用。

RibbonLoadBalancerClient Ribbon核心入口

创建一个ILoadBalancer loadBalancer = getLoadBalancer(serviceId);

获取LoadBalancer 是通过SpringClientFactory来获取对于的LoadBalancer

SpringClienFactory 是robbon 和Euraka 整合包下的

这块的意思是对每个服务进行调用都要用到对于的spring 的ApplicationContext 容器,ServiceA 服务对应着自己的

ApplicationContext容器中去获取自己的LoadBalancer即可

Ribbon如何持续从eureka中获取注册表

eureka client 本身30 秒去eureka server 更新一次注册表,拉取增量注册表,所以Ribbon 和Eureka整合的代码中

一定有定时拉取得代码

调用PollingServerListUpdater的start()方法,传入一个UpdateAction ,代表的是实际更新注册表的行为

在PollingServerListUpdate中会开启一个Runnable 线程,定时取UpdateAction 中的操作刷新注册表,从

eureka client 中获取注册表,刷新到LoadBalancer中

Ribbon如何用负载均衡算法找到一个server

LoadBalancer的chooseServer()方法,通过自己内置的负载均衡算法选择一个server

LoadBalance需要用到IRule IRule 封装的算法用的是RibbonClientConfiguration 中实例化的一个ZoneAvoidancer=Rule

调用它的choose()方法选择一个server,其实是先执行过滤规则,过滤掉一批server ,根据自己的制定的filter,然后用round robin

轮训算法,依次获取server

拿到选出来的server如何发起一个请求

在LoadBalancerInterceptor中,可以找到调用RibbonLoadBalancerClient.execute()方法的地方

在RibbonLoadBalancerClient.execute()中调用了apply方法,在这个方法中传入选择出来的server,意思

是对这台机器发起指定请求,将请求地址封装在LoadBalancerRequest中,将LoadBalancerRequest和server

再次封装为一个WrapperHttpRequest,然后将封装好的WrapperHttpRequest交给ClientHttpRequestExecution ,

然后ClientHttpRequestExecution发起http请求

ribbon 检测服务器存活有效吗

默认情况下是不生效的eureka 有自己的故障发现和服务摘除机制,ribbon与eureka 整合,自动就有一套

故障服务发现和摘除机制

ribbon 中的IPing 会有一个定时任务,每隔30秒执行一下pingTask 任务,把server list 里的服务都ping 一遍


版权声明:本文为wumingxiaozei原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。