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

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

public class BestAvailableRule extends ClientConfigEnabledRoundRobinRule {}

AvailabilityFilteringRule

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

public class AvailabilityFilteringRule extends PredicateBasedRule {}

WeightedResponseTimeRule

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

public class WeightedResponseTimeRule extends RoundRobinRule {}

RetryRule

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

public class RetryRule extends AbstractLoadBalancerRule {}

RoundRobinRule

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

public class RoundRobinRule extends AbstractLoadBalancerRule {}

RandomRule

随机选择一个server 在index上随机,选择index对应位置的server。类定义:

public class RandomRule extends AbstractLoadBalancerRule {}

ZoneAvoidanceRule

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

public class ZoneAvoidanceRule extends PredicateBasedRule {}

Ribbon架构图

上图中,所有请求均发送到 Amazon ELB 负载均衡服务,然后 Amazon ELB 将请求转发到某个的 API Service 服务。API Service 服务是一个 Eureka Client,且 API Service 中使用 Ribbon Client 分别对 Movie Service 和 Review Service 进行负载均衡。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号