Netflix Ribbon 简介

Netflix Ribbon 是什么?

Ribbon 是 Netflix 发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将 Netflix 的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项,如:连接超时,重试等。简单的说,就是在配置文件中列出 Load Balancer 后面所有的机器,Ribbon 会自动的帮助你基于某种策略(例如:简单轮询,随即连接等等)去调用这些主机。而且,我们可以很容易使用 Ribbon 实现自定义的负载均衡算法。

注意事项

(1)Netflix Ribbon 与 Eureka 一样都是 Netflix 下的子项目,Spring Cloud 对它们进行了集成。

(2)Netflix Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,可以轻松地将面向服务的 REST 模版请求自动转换成客户端负载均衡的服务调用。

(3)Spring Cloud Ribbon 虽然只是一个工具类框架,它不像服务注册中心、配置中心、API 网关那样需要独立部署,但是它几乎存在于每一个 Spring Cloud 构建的微服务和基础设施中。因为微服务间的调用,API 网关的请求转发等内容,实际上都是通过 Netflix Ribbon 实现。

(4)Nginx 在服务端实现负载均衡,Netflix Ribbon 在客户端提供负载均衡。即客户端程序使用 Netflix Ribbon 后,就会自动对多个节点微服务进行负载均衡。

(5)负载均衡有几种实现策略,常见的有:随机 (Random)、轮询 (RoundRobin)、一致性哈希(ConsistentHash)、哈希 (Hash)、加权(Weighted)。默认是轮询。

图:Netflix Ribbon 工作流程

Ribbon 工作时分为两步:

  • 第一步先选择 Eureka Server,它优先选择在同一个 Zone 且负载较少的 Server;

  • 第二步再根据用户指定的策略,在从 Server 取到的服务注册列表中选择一个地址。其中 Netflix Ribbon 提供了多种策略,例如轮询(Round Robin)、随机(Random)、根据响应时间加权等。

Netflix Ribbon 自带负载均衡策略

BestAvailableRule

public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule {}

选择一个最小的并发请求的 server 逐个考察Server,如果 Server 被 tripped 了,则忽略,在选择其中 ActiveRequestsCount 最小的 server。

AvailabilityFilteringRule

public class AvailabilityFilteringRule extends PredicateBasedRule {}

过滤掉那些因为一直连接失败的被标记为 circuit tripped 的后端 server,并过滤掉那些高并发的的后端 server(active connections 超过配置的阈值)使用一个 AvailabilityPredicate 来包含过滤 server 的逻辑,其实就就是检查 status 里记录的各个 server 的运行状态。

WeightedResponseTimeRule

public class WeightedResponseTimeRule extends RoundRobinRule {}

根据响应时间分配一个 weight,响应时间越长,weight越小,被选中的可能性越低。一个后台线程定期的从 status 里面读取评价响应时间,为每个 server 计算一个 weight。Weight 的计算也比较简单 responsetime 减去每个 server 自己平均的responsetime 是 server 的权重。当刚开始运行,没有形成 statas 时,使用 roubine 策略选择 server。

RetryRule

public class RetryRule extends AbstractLoadBalancerRule {}

对选定的负载均衡策略机上重试机制。在一个配置时间段内当选择 server 不成功,则一直尝试使用 subRule 的方式选择一个可用的 server。

RoundRobinRule

public class RoundRobinRule extends AbstractLoadBalancerRule {}

roundRobin 方式轮询选择 server 轮询 index,选择 index 对应位置的 server。

RandomRule

public class RandomRule extends AbstractLoadBalancerRule {}

随机选择一个server 在index上随机,选择index对应位置的server

ZoneAvoidanceRule

public class ZoneAvoidanceRule extends PredicateBasedRule {}

复合判断server所在区域的性能和server的可用性选择server 使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。

Ribbon架构图

说说我的看法
全部评论(
没有评论
关于
本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,请来信告知:hxstrive@outlook.com
公众号