(二)SpringCloud之Ribbon负载均衡
Ribbon负载均衡的使用
1、什么是Ribbon
Spring Cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。包括Feign提供的声明式服务嗲用也是基于该Ribbon实现的。
Ribbon默认提供7种负载均衡算法
- 轮询策略(默认)
- 权重轮询策略
- 随机策略
- 最少并发策略
- 重试策略
- 可用性敏感策略
- 区域敏感策略
如果以上七种算法都不满足需求,还可以自定义负载均衡算法
2、Ribbon的作用是什么
Ribbon提供了一套适用于微服务的负载均衡解决方案。
3、负载均衡不同方案的区别
目前业界主流的负载均衡方案可以分为两类
- 集中式负载均衡(服务器负载均衡)
- 进程式负载均衡(客户端负载均衡,Ribbon就属于该方案)
3.1、集中式负载均衡
集中式负载均衡既是在Consumer和provider之间使用独立的负载均衡设置(硬件或者软件),由该设置负责把访问请求通过某种策略转发只provider。
3.2、进程内负载均衡
将负载均衡逻辑集成到Consumer,Consumer从服务注册中心货值有哪些地址可以使用,然后自己再从这些地址中选择出一个适合的Provider。Ribbon就属于这种,它只是一个雷虎,集成与Consumer进程,Consumer通过它来获取Provider的地址。
4、负载均衡策略
4.1、轮询策略(默认)
ClassName:RoundRobinRule
实现原理:按照顺序依次获取,每次都获取下一个,循环。
4.2、权重轮询策略
ClassName:WeightedResponseTimeRule
实现原理:根据每个Provider的相应时间分配一个权重,相应时间越长,权重越小,被选中的可能性就越低。一开始为轮询策略,并开启一个计时器,每30秒收集一次每个Provider的平均响应时间,当信息足够时,给每个Provider附上一个权重,并按权重随机选择Provider,权重越高的Provider会被高概率选中。
4.3、随机策略
ClassName:RandomRule
实现原理:从Provider中随机选取一个。
4.4、最少并发数策略
ClassName:BestAvailableRule
实现原理:选在请求中并发量最小的Provider,排除熔断的Provider。
4.5、重试策略
ClassName:RetryRule
实现原理:轮询策略的增强版,区别在于,轮询策略当服务器不可用时,不会做任何处理,而重试策略在服务不可用时会重新尝试集群中的其他节点。
4.6、可用性策略
ClassName:AvailabilityFilteringRule
实现原理:过滤掉性能差的Provider,过滤掉Eureka中处于一直连接失败的Provide。过滤掉高并发的Provider。
4.7、区域敏感策略
ClassName:ZoneAvoidanceRule
实现原理:以一个区域为单位,一旦这个这个区域中的服务出现不可用,则丢弃整个区域,从其他区域中选取可用的Provider。如果这个IP区域中有一个或多个实例不可达或响应变慢,都会降低该区域内其他IPs被选中的权重。
5、使用
5.1、入门使用
Provider02添加依赖
Eureka中包含Ribbon依赖
1 | <!-- 项目依赖 --> |
Provider配置文件
多个Provider之间端口不可重复。但是应用名称要一致。
1 | server: |
配置完成,默认就是轮询策略。
5.2、指定其他负载均衡策略
Ribbon是进程内负载均衡,所以需要在Consumer中进行指定要使用的负载均衡策略。
5.2.1、全局
在启动类中或配置类中注入负载均衡策略对象,则所有的服务在请求时均使用该策略。
1 | // IOC容器注入RandomRule |
5.2.2、局部
修改配置文件指定服务的负载均衡策略
1 | # service-provider是服务的名称 |
6、点对点直连
在开发中,每次测试都从注册中心获取服务,比较麻,所以可以直接绕过注册中心,直连服务提供者获取服务。这种就叫做点对点直连。
添加修改依赖
注释掉Consumer原有的Eureka依赖,添加Ribbon依赖
1 | <!-- netflix eureka server 依赖 --> |
修改Consumer配置文件
1 | # service-provider是服务的名称 |