Ribbon 是什么

Ribbon 是 Netflix 公司发布的一个客户端 IPC 库,主要提供以下功能:

  • 负载均衡(Load Balance)

  • 容错(Fault tolerance)

  • 多协议支持(HTTP\TCP\UDP)

  • 缓存和批处理

负载均衡方案

主流的负载均衡策略可以分为两种:

一种是集中式Load Balance(缩写:LB), 即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务的提供方;

另一种是进程内Load Balance,将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。Ribbon就属于后者,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。

Ribbon 的均衡负载策略

Ribbon 支持多种均衡负载策略,在源代码中,Ribbon 中的 IRule 接口代表均衡负载策略:

实现类作用
RoundRobinRule轮询策略
RandomRule随机策略
RetryRule先使用轮询策略,如果获取服务失败,则进行重试
WeightedResponseTimeRuleRoundRobinRule 的扩展,响应速度越快的服务,权重越高。优先选择权重高的服务
BestAvailableRule过滤多次发生故障的服务,选择并发量最小的服务
AvailabilityFilteringRule过滤故障服务,选择并发量小的服务
ZoneAvoidanceRule默认规则,选择区域内可用性能最高的服务

Ribbon 策略使用

RestTemplate

RestTemplate 是Spring 提供的用于访问Rest 服务的库。在配置类中,通过加 @LoadBalanced 注解,可创建具有负载均衡能力的 RestTemplate 实例:

@Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } 

更改默认策略

使用 RestTemplate 发起 Rest 请求,会默认采取轮询策略,以下代码可以更换默认策略。

@Bean public IRule ribbonRule() { return new BestAvailableRule(); } 

指定策略

Ribbon 提供更加细粒度的配置策略能力,例如 消费者A 访问 服务者集群节点B 采用轮询策略,而访问 服务者集群节点C 采用随即策略。

  • 创建客户端访问 服务B的 配置类

    @Configuration
    @RibbonClient(name=“SERVICE-B”,configuration = RibbonRandomRuleConfiguration.class)
    public class ServiceBRibbonConfiguration {
    }

    • 创建 Ribbon 策略配置类。注意此类,不能放在 @ComponentSan 扫描的当前包,以及子包下面。对于 SpringBoot 项目来说,就是不能放在启动类所在包,以及子包里面。

    例如:项目启动类在 cn.liaocp.module.blog 中,那这个配置里可以放在 cn.liaocp.module.config 中。

    @Configuration public class RibbonRandomRuleConfiguration { //Ribbon提供的负载均衡策略 @Bean public IRule ribbonRule(){ return new RandomRule(); } } 
    

    如果上面的类,放在 @ComponentSan 可扫描的包或子包中,项目的全局默认策略变成此配置的策略。

    轮询策略算法解析

    如果一个服务者有两个集群节点,B 和 C,一个消费者节点 A。

    轮询策略的效果:
    当消费者 A,第一次请求服务,此时返回的为 B 节点服务者里面的接口。
    当消费者 A,第二次请求服务,此时返回的为 C 节点服务者里面的接口。
    当消费者 A,第三次请求服务,此时返回的为 B 节点服务者里面的接口。

    算法原理

    接口的第 N 此请求 % 集群节点数量 = 集群节点的下标数。
    通过下标数,在节点列表获取到具体的节点。需要注意,每次重启 N 从 1 开始。

    源码分析

    参考文章: