Class MyRule Implements IRule{
}
来实现特定的规则往特定的服务上分发
很少需要定制负载均衡算法,除非是hash分发的那种场景,不过分布式系统中尽量减少hash分发情况
1)RoundRobinRule:系统内置的默认负载均衡,直接轮训
2)AvailabilityFilteringRule :这个rule会考察服务器性能
3)带权重的规则,如果某个服务器响应时间长,权重降低,减少访问
4)ZoneAvoidanceRule:根据区域或服务器进行负载均衡,就是基于机房的
5)BastAvaiable:忽略连接失败的服务器,尽量找到并发低的服务器来请求
6)RandomRule:随机找一个服务器
3. ribbon里定时ping服务器的接口
这个注解的意思是,将一个RestTemplate 标志位底层采用LoandBalancerClient来执行实际的HTTP请求
支持负载均衡
AsynLoadBalancerAutoConfiguration 带有Asyn 的可以猜想到时异步调用,可能根本没用到
LoadBalancerAutoConfiguration :专门为Ribbon 搞得一个配置类
RestTemplateCustomizer : 专门对RestTemplate 进行定制化的一个组件
内置RestTemplate 拦截器insterceptor拦截器。里边有一些Retry的代码,就是对RestTemplate 调用
重试
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 一遍