Ribbon源码解析
- 1. LoadBalancerClient
- 2. BaseLoadBalancer
- 3. DynamicServerListLoadBalancer
- 4. IRule
- 5. IPing
- 6. DynamicServerListLoadBalancer与Eureka
- 7. Ribbon更新数据的时间
- 8. @LoadBalancer
git地址
https://github.com/a18792721831/studySpringCloud.git
本文全为源码跟踪等,无实际项目。
此文主要笔记使用,基本都是从书本摘抄。
1. LoadBalancerClient
LoadBalancerClient是接口,有三个方法,有多个实现
我们主要看的就是RibbonLoadBalancerClient
其关系图如下
ServiceInstanceChooser接口只有一个方法。
那么RibbonLoadBalancerClient就实现了choose方法等
看下choose方法
这里调用方法getServer方法
这里看到最终有ILoadBalancer的chooseServer去获取的。
ILoadBalancer是一个接口,有5个方法(不包含计划删除的)
- addServers添加服务集合
- chooseServer根据key选择服务
- markServerDown标记某个服务下线
- getReachableServers获取可用的服务集合
-
getAllServers获取所有的集合
ILoadBanlancer有多个实现类
AbstractLoadBalancer有四个实现类
2. BaseLoadBalancer
根据接口,其必然实现了ILoadBalancer的方法。
addServers
被放到了allServerList变量中
存在两个volatile修饰的列表,保证并发安全。还有对应的两个读写锁。。
使用锁进行更新。
3. DynamicServerListLoadBalancer
其关系如下
继承BaseLoadBalancer,聚合Server
DynamicServerListLoadBalancer需要配置IClientConfig、IRule、IPing、ServerList、ServerListFilter和ILoadBalancer.
在BaseLoadBalancer中默认实现如下配置
- IClientConfig ribbonClientConfig:DefaultClientConfigImpl
- IRule ribbonRule:RoundRobinRule
- IPing ribbonPing:DummyPing
- ServerList ribbonServerList:ConfigurationBasedServerList。
- ServerListFilter ribbonServerListFilter:ZonePreferenceServerListFilter。
- ILoadBalancer ribbonLoadBalancer:ZoneAwareLoadBalancer。
-
IClientConfig 用于配置负载均衡的客户端,IClientConfig 的默认实现类为 DefaultClient-
ConfigImpl。
4. IRule
IRule 用于配置负载均衡的策略,IRule有3个方法,其中choose()是根据key来获取 server实例的,setLoadBalancer和getLoadBalancer是用来设置和获取ILoadBalancer的
其实现较多。
- BestAvailableRule:选择最小请求数。
- ClientConfigEnabledRoundRobinRule:轮询。
- RandomRule:随机选择一个 server。
- RoundRobinRule:轮询选择server。
- RetryRule:根据轮询的方式重试。
- WeightedResponseTimeRule:根据响应时间去分配一个 weight,weight越低,被选择的可能性就越低。
- ZoneAvoidanceRule:根据 server 的zone区域和可用性来轮询选择。
5. IPing
- PingUrl:真实地去ping 某个Url,判断其是否可用。
- PingConstant:固定返回某服务是否可用,默认返回true,即可用。
- NoOpPing:不去 ping,直接返回true,即可用。
- DummyPing:直接返回true,并实现了 initWithNiwsConfig方法。
- NIWSDiscoveryPing:根据 DiscoveryEnabledServer 的 InstanceInfo 的 InstanceStatus去判断,如果为InstanceStatus.UP,则可用,否则不可用。
6. DynamicServerListLoadBalancer与Eureka
EurekaClient的实现类为 DiscoveryClient,在上一章已经分析了。DiscoveryClient 具有服
务注册、获取服务注册列表等功能。
由此可见,负载均衡器是从 Eureka Client 获取服务列表信息的,并根据IRule的策略去路
由,根据IPing 去判断服务的可用性。