Ribbon

发布时间 2023-06-19 15:47:53作者: lwx_R

1.概念

Ribbon是一个基于HTTP和TCP的客服端负载均衡工具,它是基于Netflix Ribbon实现的。
它不像Spring Cloud服务注册中心、配置中心、API 网关那样独立部署,但是它几乎存在于每个Spring Cloud微服务中。
包括Feign提供的声明式服务调用也是基于该Ribbon实现的。
Ribbon默认提供很多种负载均衡算法,例如轮询、随机等等。甚至包含自定义的负载均衡算法。
Ribbon提供了一套微服务的负载均衡解决方案。

2.方案

目前业界主流的负载均衡方案可分成两类:

  • 集中式负载均衡(服务器负载均衡),即在consumer和provider之间使用独立的负载均衡设施(可以是硬件,如F5,也可以
    是软件,如nginx),由该设施负责把访问请求通过某种策略转发至provider;

  • 进程内负载均衡(客户端负载均衡) ,将负载均衡逻辑集成到consumer, consumer从服务注册中心获知有哪些地址可用,然
    后自己再从这些地址中选择出一个合适的provider. Ribbon 属于后者,它只是一个类库, 集成于consumer进程,consumer
    通过它来获取provider的地址。

3.策略

3.1 轮询策略(默认)

策略对应类名: RoundRobinRule
实现原理:轮询策略表示每次都顺序取下一个provider,比如一共有5个provider,第1次取第1个,第2次取第2个,第3次取第3个,以此类推。

3.2 权重轮询策略

策略对应类名: WeightedResponseTimeRule
实现原理:

  • 根据每个provider的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性越低。
  • 原理: 一开始为轮询策略,并开启一个计时器,每30秒收集一次每个provider的平均响应时间,当信息足够时,给每个
    provider附上一个权重,并按权重随机选择provider,高权越重的provider会被高概率选中。

3.3 随机策略

策略对应类名: RandomRule
实现原理:从provider列表中随机选择一个。

3.4 最少并发数策略

策略对应类名: BestAvailableRule
实现原理:选择正在请求中的并发数最小的provider,除非这个provider在熔断中。

3.5 重试策略

策略对应类名: RetryRule
实现原理:其实就是轮询策略的增强版,轮询策略服务不可用时不做处理,重试策略服务不可用时会重新尝试集群中的其他节点。

3.6 可用性敏感策略

策略对应类名: AvailabilityFilteringRule
实现原理:过滤性能差的provider

  • 第一种:过滤掉在Eureka中处于一直连接失败的provider.
  • 第二种:过滤掉高并发(繁忙)的provider.

3.7 区域敏感性策略

策略对应类名: ZoneAvoidanceRule
实现原理:

  • 以一个区域为单位考察可用性,对于不可用的区域整个丢弃,从剩下区域中选可用的provider.
  • 如果这个ip区域内有一个或多个实例不可达或响应变慢,都会降低该ip区域内其他ip被选中的权重。

4.策略实现

4.1 全局

  • 在消费者启动类加入
    //全部Ribbon策略
    @Bean
    public RandomRule randomRule(){
        return new RandomRule();
    }

4.2 局部

  • application.yml
#局部负载均衡策略
#provider 对应的服务名
provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

5.点对点直连

  • pom.xml
    删除Eureka的依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
  • application.yml
    删除Eureka的配置
#局部负载均衡策略
#provider 对应的服务名
provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
    #指定具体Provider服务列表 逗号隔开
    listOfServers: http://localhost:7070, http://localhost:7071

#关闭Eureka 实现Ribbon点对点直连
ribbon:
  eureka:
    enabled: false