终于有人放大招把Ribbon的核心工作原理给一次性讲清楚了

2022-10-28 15:13:32 浏览数 (1)

本篇文章即将介绍Ribbon的核心工作原理。

Ribbon的核心工作原理

下面我们从Ribbon的负载均衡核心组件、负载均衡策略、Ribbon的工作流程等方面讲解Ribbon的核心工作原理。

Ribbon的负载均衡核心组件

● Rule:用于从服务列表中选取服务的逻辑组件。

● Ping:在后台运行的确保服务可用性的组件。

● ServerList:服务列表,它可以是静态的也可以是动态的,如果是动态的( DynamicServer-ListLoadBalancer),将会启动一个后台线程定期刷新和过滤服务列表。

这些组件可以使用程序进行配置,也可以使用客户端配置属性进行 配 置 , 以 下 是 配 置 文 件 中 相 关 的 属 性 名 ( 注 意 带 上 前 缀<clientName>.<nameSpace>.):

● NFLoadBalancerClassName:配置ILoadBalancer的实现类。

● NFLoadBalancerPingClassName:配置IPing的实现类。

● NFLoadBalancerRuleClassName:配置IRule的实现类。

● NIWSServerListClassName:配置ServerList的实现类。

● NIWSServerListFilterClassName:配置ServerListFilter的实现类。

例如,将backend-service后端服务配置使用自带的RetryRule进行路由转发,下面是配置详情:

在我们的应用程序中Netflix为每个Ribbon客户端名称创建一个ApplicationContext,用于客户端自定义一些组件实现,包括:

● IClientConfig:为客户端或者负载均衡器保存客户端配置信息。

● ILoadBalancer:代表一个软件的负载均衡接口。

● ServerList:定义了如何获取可供选择的服务列表。

● IRule:描述负载均衡策略。● IPing:说明如何执行服务器的周期性Ping。

Ribbon的负载均衡策略

Ribbon客户端组件提供一系列完善的配置选项,比如连接超时、重试、重试算法等。Ribbon内置可插拔、可定制的负载均衡组件,下面是用到的一些负载均衡策略。

● 简单轮询负载均衡(RoundRobinRule):这是最简单的通过循环法选择服务的负载均衡策略。它通常用作默认策略或更高级策略的后备策略。

● 可用服务过滤负载均衡(AvailabilityFilteringRule):这个策略会跳过断路中的服务,或者高并发连接数的服务。默认情况下,如果RestClient最近三次连接均失败,则认为该服务实例断路,该实例会保持断路状态30s后进入回路关闭状态,如果此时仍然连接失败,那么等待进入关闭状态的时间会随失败次数的增加指数级增长。

● 加权响应时间负载均衡(WeightedResponseTimeRule):这个策略会为每一个服务按响应时长分配权重,响应时间越长权重越低,权重代表了该服务会被选中的概率。

● 区域感知负载均衡:这个策略基于区域同源关系(ZoneAffinity,也就是更倾向于选择发出调用的服务所在的托管区域内的服务,这样可以降低延迟,节省成本)选择目标服务 实 例 。Ribbon 使 用 ZoneAvoidancePredicate 和AvailabilityPredicate来判断是否选择某个后端服务,前者使用一个区域为单位考察可用性,不可用的区域会被丢弃,从剩下的区域中选择可用的服务,AvailabilityPredicate用于过滤掉连接数过多的服务。

● 重试负载均衡(RetryRule):当请求分发到集群中的一个服务后,请求连接失败或者响应超时,会重新请求以获取可用服务,可以选择重试当前服务节点,也可以改换其他节点。

● 随机负载均衡(RandomRule):在现有服务之间随机分配流量的一种负载均衡策略。

Ribbon的工作流程

下图是Ribbon的工作流程简图,我们在源码分析中会进一步分析,了解Ribbon是如何拦截HTTP请求进行负载均衡的。

Ribbon首先会拦截所有标注@LoadBalance注解的RestTemplate,然 后 将 Ribbon 默 认 的 拦 截 器 LoadBalancerInterceptor 添 加 到RestTemplate的执行逻辑中,这样每次执行RestTemplate时都会拦截HTTP请求。当有请求发生时,Ribbon默认会创建一个IloadBalancer实例。ILoadBalance在RibbonClientConfiguration中完成自动配置,它可以实现定制化的IRule、IPing、ServerList。当发生HTTP请求时,IloadBalancer在服务集群中选择一个服务,然后发送请求到后端服务。

本文给大家讲解的内容是Ribbon的核心工作原理

  1. 下篇文章给大家讲解的内容是Ribbon源码解析
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

0 人点赞