1. 线性轮询策略: RoundRibbonRule
    BaseLoadBalancer 负载均衡器默认采用线性负载轮询负载均衡策略。
    工作流程:
  1. RoundRibbonRule 类的 choose(ILoadBalancer Ib,Object key) 方法初始化一个计数器。
  2. incrementAndGetModulo() 方法获取一个下标 (是先加1,然后和服务清单总数取模获取到的,不会越界),是一个不断增长的数。
  3. chooseServer(Object key) 方法拿着下标去服务列表中获取服务,每次循环计数器都会加1。如果连续10次都没有取到服务,则会报 “No available alive servers after 10 tries from loadbalancer.” 警告。
  1. 重试策略:RetryRule
    重试策略在使用 RetryRule 类中定义的 choose(ILoadBalance Ib,Object key) 方法来选择一个服务实例。
    choose() 方法也是采用 RoundRibbonRule 中的 choose() 方法来选择一个服务实例的。
    工作流程
  1. 如果选择到的服务实例正常,则返回数据。
  2. 如果选择到的服务实例为 null 或 失效,则 choose() 方法会在失效时间前不断地进行重试。
  3. 如果超过了失效时间还是没有取到,则返回一个 null。
  1. 加权响应时间策略:WeightedResponseTimeRule
    WeightedResponseTimeRule 类是 RoundRibbonRule 的一个子类,它对 RoundRibbonRule 的功能进行了扩展。它根据每一个服务实例的运行情况先计算出该服务实例的一个权重,然后根据权重进行服务实例的挑选,这样能够调用到更优的服务实例。
    工作流程
  1. 每 30S 计算一次各服务实例的响应时间,以响应时间来计算权重。平均响应时间越短则权重越高,权重越高则被选中的的概率越高,反之则被选中的概率较低。
  2. WeightedResponseTimeRule 中有一个名叫 DynamicServerWeightTask 的定时任务。它是一个后台线程,定期从 status 里面读取响应时间,用来计算每个服务实例权重。
  1. 随机策略:RandomRule
    随机选择一个可用的服务实例。
    工作流程
  1. 负载均衡通过 upList() 和 allList() 方法获得可用服务实例列表,然后初始化了一个 Randow 对象以生成一个不大于服务实例总的随机数。
  2. choose() 方法将该随机数作为下标获取一个服务实例。轮询 “index” 选择 “index” 对应的服务实例。
  1. 客户端配置启动线性轮询策略:ClientConfigEnabledRoundRobbinRule
    继承该策略默认的 choose() 方法就能实现线性轮询机制。
  2. 最空闲策略:BestAvailableRule
    该服务是逐个考察各服务实例,然后选择一个最小的并发请求的服务实例来提供实例。BestAvailableRule 继承自 ClientConfigEnabledRoundRobbinRule 类。
    工作流程
  1. 根据在 loadBalancerStats() 方法中保存的服务实例的状态信息来过滤失效的服务实例。
  2. 判断 loadBalancerStats 是否为空。
  1. 如果 loadBalancerStats 不为空,则找出并发请求最小的服务实例来使用。
  2. 如果 loadBalancerStats 为空,则 BestAvailableRule 类将采用它的父类。即 ClientConfigEnabledRoundRobbinRule 的服务选取策略 (线性策略)。
  1. 过滤性线性轮询策略:PredicateBasedRule
    PredicateBaseRule 类是 ClientConfigEnabledRoundRobbinRule 类的一个子类,它通过内部定义的一个过滤器过滤出一部分服务实例清单,然后用线性轮形的方式从过滤出来的服务实例清单中选取提个服务实例。
  2. 区域感知轮询策略:ZoneAvoidanceRule
    该策略以区域、可用的服务器为基础,选择服务实例并对服务实例进行分类。ZoneAvoidanceRule 类是 PredicateBasedRule 类的一个实现类,它有一个组合过滤条件 (CompositePredicate)。ZoneAvoidanceRule 类中的过滤条件是 “以 ZoneAvoidancePredicate() 方法为主过滤条件” 和 “以AvailabilityPredicate() 方法为次过滤条件” 组成的。在过滤成功后,继续采用线性轮询的方式从过滤结果中选择出一个服务实例。
  3. 可用性过滤策略:AvailabilityFilteringRule
    该策略根据服务状态 (宕机和繁忙) 来分配权重,过滤掉那些因为一直连接失败或高并发的服务实例。它使用一个 AvailabilityPredicate() 方法来包含过滤逻辑。