Ribbon 源码分析

Ribbon 源码分析

Ribbon Debug 分析

  1. 断点 LoadBalancerInterceptor

    1. LoadBalancerInterceptor 实现了 ClientHttpRequestInterceptor 接口,重写了其中的 intercept 方法,用来拦截请求;

    2. 获取原始的 uri 和 服务名,调用 LoadBalancerClient 中的 execute 方法;[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Wm2pe9wo-1692369980696)(D:\开源之夏活动\源码及流程分析\gateway.assets\image-20230818212017568.png)]

  2. 追踪 LoadBalancer 的实现 RibbonLoadBalancerClient

    1. 这里根据上面传入的服务名字作为服务的 ID去获取负载均衡器;

    2. 再根据负载均衡器去选择服务实例,继续执行 execute 方法。
      在这里插入图片描述

  3. 追踪 this.getServer 方法

    调用 loadBalancer.chooseServer 实现负载均衡,选择一个具体服务发起服务调用。
    在这里插入图片描述

  4. 进入 chooseServer 方法

    发现有三个实现类,进入第一个实现
    在这里插入图片描述

  5. 追踪 BaseLoadBalancer

    1. 这里调用 IRule 接口的 choose 方法选择服务实例;

    2. 进入 rulechoose 方法。
      在这里插入图片描述

  6. 查看 IRule

    这里 IRule 的实现类是 ZoneAvoidLoadBalancer
    在这里插入图片描述

  7. 到此为止,就走完了整个 ribbon 的负载均衡流程,发起服务调用

  8. Demo地址:https://github.com/yuluo-yx/ribbon-source.git

  9. 调用流程总结如下

    1. LoadBalancerInterceptor 拦截请求;
    2. RibbonLoadBalancerClient 替换拦截到的请求 uri,并获取服务名字做为服务ID:
    3. chooseServer 选择服务;
    4. BaseLoadBalancer 的子类 DynamicServerListLoadBalancer 从注册中心拉取服务列表;
    5. IRule 根据负载均衡算法,选择服务实例;
    6. RibbonLoadBalancerClient 修改请求,发起真实服务调用。

负载均衡器接口

在这里插入图片描述

ILoadBalancer 接口中有以下方法:

public interface ILoadBalancer {
    //往该ILoadBalancer中添加服务
    void addServers(List<Server> var1);

    //选择一个可以调用的实例,keyb不是服务名称,而是zone的id
    Server chooseServer(Object var1);

    //标记下线服务
    void markServerDown(Server var1);

    /** @deprecated */
    @Deprecated
    List<Server> getServerList(boolean var1);

    //获取可用服务列表
    List<Server> getReachableServers();

    //获取所有服务列表
    List<Server> getAllServers();
}

类关系说明:

  1. AbstractLoadBalancer:定义了一个关于服务实例的分组枚举类 ServerGroup,定义了一个 chooseServer 方法去调用 ILoadBalancer 接口中的 chooseServer方法,抽象的 getServerList 方法来获取获取的服务,定义抽象方法 getLoadBalancerStats 获取 LoadBalancer 相关的统计信息
  2. BaseLoadBalancer 类是 Ribbon 负载均衡器的基础实现类,在该类中定义了很多关于负载均衡器相关的基础内容。
  3. DynamicServerListLoadBalancer 类继承了 BaseLoadBalancer,它是对基础负载均衡器的扩展。在该负载均衡器中,实现了服务实例清单在运行期的动态更新能力,同时,它还具备了对服务实例清单的过滤功能,也就是说,我们可以通过过滤器来选择性的获取一批服务实例清单。

负载均衡规则接口

在这里插入图片描述

IRule:负载均衡规则的顶层接口。

各个内置的负载均衡规则类如下:(其中 ZoneAvoidanceRule 是默认实现,根据可用去对服务进行分类)

内置负载均衡规则类规则描述
RoundRobinRule简单轮询服务列表来选择服务器。它是Ribbon默认的负载均衡规则。
AvailabilityFilteringRule对以下两种服务器进行忽略: (1)在默认情况下,这台服务器如果3次连接失败,这台服务器就会被设置为“短路”状态。短路状态将持续30秒,如果再次连接失败,短路的持续时间就会几何级地增加。 (2)并发数过高的服务器。如果一个服务器的并发连接数过高,配置了AvailabilityFilteringRule规则的客户端也会将其忽略。并发连接数的上限,可以由客户端的…ActiveConnectionsLimit属性进行配置。
WeightedResponseTimeRule为每一个服务器赋予一个权重值。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择。
ZoneAvoidanceRule以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询。
BestAvailableRule忽略那些短路的服务器,并选择并发数较低的服务器。
RandomRule随机选择一个可用的服务器。
RetryRule重试机制的选择逻辑看了一下 前端项目 docusurnse 的项目结构,做了一些撰写文档的准备工作,熟悉了一些编写流程,预计今天可以写完 concept 部分的文档。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Ribbon组合框是一种常见的图形用户界面控件,常用于显示和选择多个选项中的一个。它通常与Ribbon界面风格相结合,使用户能够在菜单和工具栏之外获得更多的操作选项。 Ribbon组合框具有以下几个主要特点。首先,它具有下拉列表的功能,用户可以通过点击或下拉箭头来打开下拉菜单,从中选择一个选项。其次,它支持文本和图标显示,可以根据需要显示选项的文本描述或使用图标来进行直观展示。再次,它可以自动完成用户的输入,即根据用户键入的信息来筛选和匹配可选项,提供更加智能的交互体验。 Ribbon组合框的应用场景非常广泛。例如,在表单设计中,可以使用Ribbon组合框来选择性别、部门、职位等信息;在电商网站中,可以使用Ribbon组合框来选择商品的分类、品牌或价格范围;在音乐播放器中,可以使用Ribbon组合框来选择歌曲的艺术家、专辑或流派。总之,无论是选择固定选项,还是根据输入内容进行筛选,Ribbon组合框都是一种非常便捷和直观的控件。 在使用Ribbon组合框时,需要注意以下几点。首先,要保持选项的清晰和有序,避免选项数量过多或杂乱无章;其次,要根据界面整体布局和风格设计,选择合适的颜色、尺寸和样式;再次,要为组合框提供适当的提示和帮助信息,如下拉菜单的简洁说明或自动完成的操作提示。 总之,Ribbon组合框是一种强大的用户界面控件,提供了丰富的选项选择和交互功能,在各种应用场景下都能发挥其作用。通过合理使用和设计,可以营造出更加方便和高效的用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值