Ribbon简介
1. Ribbon介绍
**Ribbon是由Netflix公司推出的开源软件,是基于HTTP和TCP协议的,其主要功能是实现客户端软件的负载均衡算法。**
**Spring Cloud中Ribbon就是基于Netflix公司的Ribbon实现的。它不需要单独部署,但是却存在于整个微服务中。前面学习的Eureka里面有Ribbon,后面学习的Feign也是基于Ribbon实现的。**
2. Ribbon原理
内部基于ILoadBalancer实现的(代码层面)的继承关系如下:
使用Ribbon工作原理:
**所有的项目都会注册到Eureka中,允许不同项目的spring.application.name是相同。当相同时会认为这些项目一个集群。**
**Application Client会从Eureka中根据spring.application.name加载Application Service的列表。根据设定的负载均衡算法,从列表中取出一个URL,到此Ribbon的事情结束了。剩下的事情由程序员自己进行技术选型,选择一个HTTP协议工具,通过这个URL调用Application Service。**
3. 负载均衡解决方案分类及特征
业界主流的负载均衡解决方案有:集中式负载均衡和线程内负载均衡。
集中式负载均衡
即在客户端和服务端之间使用独立的负载均衡设施(可以是硬件,如F5, 也可以是软件,如nginx), 由该设施负责把访问请求通过某种策略转发至服务端。(服务器端负载均衡)
进程内负载均衡
将负载均衡逻辑集成到客户端组件中,客户端组件从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务端发起请求。Ribbon就是一个进程内的负载均衡实现。(客户端负载均衡)
4. Ribbon 和 Nginx 区别
执行流程
用户向nginx发起请求,nginx根据权重访问所代理中一个服务器,也就是application client,application client通过ribbon进行负载均衡算法计算出访问的application service 的uri,根据uri访问application service
由于Ribbon是在Application Client 方使用,所以称为客户端负载均衡
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被选中的权重。