当前位置: 首页 > news >正文

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的idServer chooseServer(Object var1);//标记下线服务void markServerDown(Server var1);/** @deprecated */@DeprecatedList<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 部分的文档。
http://www.lryc.cn/news/133908.html

相关文章:

  • 【1-3章】Spark编程基础(Python版)
  • 宇宙原理:黑洞基础。
  • 分类预测 | MATLAB实现SCNGO-CNN-LSTM-Attention数据分类预测
  • Android学习之路(7) Frament
  • metallb , istio ingress 部署httpbin使用例子
  • 基于swing的销售管理系统java仓库库存信息jsp源代码mysql
  • FreeCAD傻瓜式教程之约束设定和构建实体、开孔、调整颜色等
  • 代码随想录算法训练营day41 | 343. 整数拆分,96. 不同的二叉搜索树
  • 飞天使-k8sv1.14二进制安装
  • TypeScript封装Axios
  • 指针(一)【C语言进阶版】
  • 回归预测 | MATLAB实现SA-BP模拟退火算法优化BP神经网络多输入单输出回归预测(多指标,多图)
  • springMVC 已解密的登录请求
  • 机器学习赋能乳腺癌预测:如何使用贝叶斯分级进行精确诊断?
  • Java后端开发面试题——框架篇
  • 【新版】系统架构设计师 - 系统测试与维护
  • 使用 useEffect 和 reactStrictMode:优化 React 组件的性能和可靠性
  • 商业智能BI是什么都不明白,如何实现数字化?
  • 【五子棋】
  • docker 01(初识docker)
  • 爬虫逆向实战(十九)--某号站登录
  • linux环境docker安装mysql
  • taro h5 formData上传图片的坑-Required request part ‘file‘ is not present
  • GNU GRUB version 2.06 Minimal Bash-lke line editing is supported 问题修复
  • Embedding 向量生成GPT数据使用相关
  • Jenkins工具系列 —— 配置邮箱 每个job下动态设置临时发送人
  • 华纳云:ubuntu中怎么查看进程占用的端口
  • 【学会动态规划】 最长递增子序列(26)
  • Azure虚拟网络对等互连
  • CTFhub-sql-整数注入