Ribbon简介

1. Ribbon介绍

  1. **Ribbon是由Netflix公司推出的开源软件,是基于HTTPTCP协议的,其主要功能是实现客户端软件的负载均衡算法。**
  2. **Spring CloudRibbon就是基于Netflix公司的Ribbon实现的。它不需要单独部署,但是却存在于整个微服务中。前面学习的Eureka里面有Ribbon,后面学习的Feign也是基于Ribbon实现的。**

2. Ribbon原理

内部基于ILoadBalancer实现的(代码层面)的继承关系如下:

3. 客户端负载均衡Ribbon - 图1

使用Ribbon工作原理:

  1. **所有的项目都会注册到Eureka中,允许不同项目的spring.application.name是相同。当相同时会认为这些项目一个集群。**
  2. **Application Client会从Eureka中根据spring.application.name加载Application Service的列表。根据设定的负载均衡算法,从列表中取出一个URL,到此Ribbon的事情结束了。剩下的事情由程序员自己进行技术选型,选择一个HTTP协议工具,通过这个URL调用Application Service。**

3. 负载均衡解决方案分类及特征

业界主流的负载均衡解决方案有:集中式负载均衡和线程内负载均衡。

  • 集中式负载均衡

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

3. 客户端负载均衡Ribbon - 图2

  • 进程内负载均衡

    将负载均衡逻辑集成到客户端组件中,客户端组件从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务端发起请求。Ribbon就是一个进程内的负载均衡实现。(客户端负载均衡)

3. 客户端负载均衡Ribbon - 图3

4. Ribbon 和 Nginx 区别

执行流程

  1. 用户向nginx发起请求,nginx根据权重访问所代理中一个服务器,也就是application clientapplication client通过ribbon进行负载均衡算法计算出访问的application service uri,根据uri访问application service

由于Ribbon是在Application Client 方使用,所以称为客户端负载均衡

3. 客户端负载均衡Ribbon - 图4

3. 客户端负载均衡Ribbon - 图5

5. Ribbon负载均衡算法

  • 轮询策略(默认)
    • 类名:RoundRobinRule
    • 轮询策略表示每次都按照顺序取下一个application service,比如一共有5个application service,第1次取第1个,第2次取第2个,第3次取第3个,以此类推
  • 权重轮询策略(常用,中小型项目使用)
    • 类名:WeightedResponseTimeRule
    • 实现原理
      • 根据每个application service的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性越低。
      • 一开始为轮询策略,并开启一个计时器,每30秒收集一次每个application service的平均响应时间,当信息足够时,给每个application service附上一个权重,并按权重随机选择application service,权重越高的application service会被高概率选中。
  • 随机策略(不推荐,测试使用,开发使用)
    • 类名:RandomRule
    • 从application service列表中随机选择一个
  • 最少并发数策略(应用在硬件软件环境一致的情况下,中小型项目使用)
    • 类名:BestAvailableRule
    • 选择正在请求中的并发数最小的application service,除非这个application service在熔断中。
  • 重试策略。在“选定的负载均衡策略”基础上进行重试机制
    • 类名:RetryRule
    • 实现原理
      • 选定的负载均衡策略 这个策略是轮询策略RoundRobinRule
      • 该重试策略先设定一个阈值时间段,如果在这个阈值时间段内当选择application service不成功,则一直尝试采用“选定的负载均衡策略:轮询策略”最后选择一个可用的application service
  • 可用性敏感策略(一般在同区域内服务集群环境中使用)
    • 类名:AvailabilityFilteringRule
    • 过滤性能差的application service
      • 第一种:过滤掉在eureka中处于一直连接失败application service
      • 第二种:过滤掉高并发的application service
  • 区域敏感性策略(应用在大型的,物理隔离分布式环境中)
    • 类名:ZoneAvoidanceRule
    • 实现原理
      • 以一个区域为单位考察可用性,对于不可用的区域整个丢弃,从剩下区域中选可用的provider
      • 如果这个ip区域内有一个或多个实例不可达或响应变慢,都会降低该ip区域内其他ip被选中的权重。