天天看点

Ribbon源码解析

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

Ribbon源码解析

LoadBalancerClient是接口,有三个方法,有多个实现

Ribbon源码解析

我们主要看的就是RibbonLoadBalancerClient

其关系图如下

Ribbon源码解析

ServiceInstanceChooser接口只有一个方法。

Ribbon源码解析

那么RibbonLoadBalancerClient就实现了choose方法等

看下choose方法

Ribbon源码解析

这里调用方法getServer方法

Ribbon源码解析

这里看到最终有ILoadBalancer的chooseServer去获取的。

ILoadBalancer是一个接口,有5个方法(不包含计划删除的)

Ribbon源码解析
  • addServers添加服务集合
  • chooseServer根据key选择服务
  • markServerDown标记某个服务下线
  • getReachableServers获取可用的服务集合
  • getAllServers获取所有的集合

    ILoadBanlancer有多个实现类

    Ribbon源码解析
    Ribbon源码解析
    AbstractLoadBalancer有四个实现类
    Ribbon源码解析

2. BaseLoadBalancer

Ribbon源码解析

根据接口,其必然实现了ILoadBalancer的方法。

addServers

Ribbon源码解析

被放到了allServerList变量中

Ribbon源码解析

存在两个volatile修饰的列表,保证并发安全。还有对应的两个读写锁。。

Ribbon源码解析

使用锁进行更新。

3. DynamicServerListLoadBalancer

其关系如下

Ribbon源码解析

继承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的

Ribbon源码解析

其实现较多。

Ribbon源码解析
  • BestAvailableRule:选择最小请求数。
  • ClientConfigEnabledRoundRobinRule:轮询。
  • RandomRule:随机选择一个 server。
  • RoundRobinRule:轮询选择server。
  • RetryRule:根据轮询的方式重试。
  • WeightedResponseTimeRule:根据响应时间去分配一个 weight,weight越低,被选择的可能性就越低。
  • ZoneAvoidanceRule:根据 server 的zone区域和可用性来轮询选择。
Ribbon源码解析
Ribbon源码解析
Ribbon源码解析
Ribbon源码解析

5. IPing

  • PingUrl:真实地去ping 某个Url,判断其是否可用。
  • PingConstant:固定返回某服务是否可用,默认返回true,即可用。
  • NoOpPing:不去 ping,直接返回true,即可用。
  • DummyPing:直接返回true,并实现了 initWithNiwsConfig方法。
  • NIWSDiscoveryPing:根据 DiscoveryEnabledServer 的 InstanceInfo 的 InstanceStatus去判断,如果为InstanceStatus.UP,则可用,否则不可用。

6. DynamicServerListLoadBalancer与Eureka

Ribbon源码解析
Ribbon源码解析
Ribbon源码解析
Ribbon源码解析
Ribbon源码解析
Ribbon源码解析

EurekaClient的实现类为 DiscoveryClient,在上一章已经分析了。DiscoveryClient 具有服

务注册、获取服务注册列表等功能。

由此可见,负载均衡器是从 Eureka Client 获取服务列表信息的,并根据IRule的策略去路

由,根据IPing 去判断服务的可用性。

7. Ribbon更新数据的时间

8. @LoadBalancer