首页 > 编程语言 > 详细

spring cloud ribbon源码解析(二)

时间:2019-04-21 22:04:01      阅读:223      评论:0      收藏:0      [点我收藏+]

  在上一篇文章中主要梳理了ribbon的执行过程,这篇主要讲讲ribbon的负载均衡,ribbon的负载均衡是通过ILoadBalancer来实现的,对ILoadBalancer有以下几个类

技术分享图片

1、AbstractLoadBalancer

 AbstractLoadBalancer是对ILoadBalancer的具体实现,通过枚举类定义了ALL:所有服务、STATUS_UP正常服务、STATUS_NOT_UP停止的服务。通过getServerList传入不同的分组获取不同的服务列表。

技术分享图片

2、BaseLoadBalancer

BaseLoadBalancer继承AbstractLoadBalancer,是ribbon负载均衡的基础实现类,定义并维护了两个服务实例列表,一个是所有服务,一个维护了正常的服务,定义了检查服务是否正常的IPing,定义了负载均衡的处理规则IRule,执行策略IPingStrategy。IPing的默认执行间隔为10秒。

技术分享图片

技术分享图片

实现了ILoadBalancer的方法:

  • addServers向负载均衡加入新的服务实例

技术分享图片

  •  markServerDown标记服务实例不可用

技术分享图片

  • getReachableServers获取可用的服务实例

技术分享图片

  • getAllServers获取所有服务实例

技术分享图片

3、DynamicServerListLoadBalancer

 DynamicServerListLoadBalancer是对BaseLoadBalancer的扩展,实现了服务实例运行中动态更新的能力,同时也具有对服务实例过滤的功能

技术分享图片

  • 更新服务实例

进入serverListUpdater服务更新器,其中定义了一些控制和获取信息的操作

技术分享图片

  • 过滤服务实例

技术分享图片

4、ZoneAwareLoadBalancer

ZoneAwareLoadBalancer是对DynamicServerListLoadBalancer的扩展,在之前几个负载均衡类中没有重写chooseServer,都是使用BaseLoadBalancer的RoundRobbinRule,采用轮询的方式,并没有zone的概念,这样会导致跨区域的时候导致延迟,产生性能问题,ZoneAwareLoadBalancer则可以避免这个问题。

技术分享图片

  • 当zone小于等于1还是按原来的方式,只有大于1才会执行接下来的策略;
  • 调用createSnapshot为所有区域创建快照;
  • 使用getAvailableZones获取可用区域;
  • randomChooseZone随机选择某个区域;
  • 区域确定后获取到负载均衡器,并调用chooseServer来选择具体服务实例。

 

spring cloud ribbon源码解析(二)

原文:https://www.cnblogs.com/sgx2019/p/10747231.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!