博客引用处(以下内容在原有博客基础上进行补充或更改,谢谢这些大牛的博客指导):
深入理解Ribbon之源码解析
概念:
Loadbalanceclient 初始化的时候,向eureka获取注册列表
并且向通过10s一次向EurekaClient发送“ping”,来判断服务的可用性,如果服务的可用性发生了改变或者服务数量和之前的不一致,则更新或者重新拉取。
LoadBalancerClient有了这些服务注册列表,就可以根据具体的IRule来进行负载均衡。 (IRule 负载均衡的策略)
结构:
Netflix
|
Riibon 负载均衡器
|
LoadBalancerClient 负载均衡的客户端(接口)-继承于ServiceInstanceChooser
-它的实现类RibbonLoadBalancerClient
{
LoadBalancerClient 3个方法
执行请求excute()
重构URL reconstructURI()
ServiceInstanceChooser的方法(
choose(String serviceId);
用来根据serviceId来获取ServiceInstance
)
RibbonLoadBalancerClient 负载最终的负载均衡的请求处理
(
RibbonLoadBalancerClient的源码中
,其中choose()方法是选择具体服务实例的一个方法。该方法通过getServer()方法去获取实例,经过源码跟踪,最终交给了ILoadBalancer类去选择服务实例。
前提需求:
1,它需要一组可供选择的服务注册列表信息。
2,根据特定方法去选择服务。
ILoadBalancer
(
实现类为DynamicServerListLoadBalancer
类中配置以下信息,IClientConfig、IRule、IPing、ServerList、ServerListFilter和ILoadBalancer
解释:
IClientConfig 用于对客户端或者负载均衡的配置
IRule用于复杂均衡的策略,它有三个方法,其中choose()是根据key 来获取server,setLoadBalancer()和getLoadBalancer()是用来设置和获取ILoadBalancer的
IRule有很多默认的实现类,这些实现类根据不同的算法和逻辑来处理负载均衡
IPing来判断该server是否有响应,从而判断该server是否可用。它有一个isAlive()方法
ServerList是定义获取所有的server的注册列表信息的接口
erverListFilter接口,定于了可根据配置去过滤或者根据特性动态获取符合条件的server列表的方法
DynamicServerListLoadBalancer最终执行了restOfInit()方法
(
在restOfInit()方法上,有一个 updateListOfServers()的方法,该方法是用来获取所有的ServerList的。
进一步跟踪updateListOfServers()方法的源码,最终由serverListImpl.getUpdatedListOfServers()获取所有的服务列表的
最终:eurekaClientProvider.get()来获取EurekaClient (他的实现类通过静态方法获取EurekaClient对象)
EurekaClient的实现类为DiscoveryClient(发现),分析了它具有服务注册、获取服务注册列表等的全部功能。
)
)
)
负载均衡器多久一次去获取一次从Eureka Client获取注册信息
(
BaseLoadBalancer的构造函数中通过setupPingTask()
1,开启(创建)了ShutdownEnabledTimer执行PingTask任务
2,默认情况下pingIntervalSeconds为10,即每10秒钟,想EurekaClient发送一次”ping”
PingTask源码,即new一个Pinger对象,并执行runPinger()方法
再通过底层的一个方法获取现有服务的可用性以及总数量是否一致,如果和之前不同,那么会EurekaClient获取注册列表,然后进行服务列表的更新或者重新拉取
)
}