简单介绍
-
Ribbon还是那个当初租碟片营生起家的NetFlix公司研发发布的,并被SpringCloud集成到了项目中,当我们为Ribbon配置服务提供者的地址列表后,Ribbon就可以根据多种之一的负载均衡算法自动的去分配服务消费者的请求;
-
由于我们已经学习过了Feign,所以RestTemplate的负载均衡我记得之前的笔记中是有的,在返回RestTemplate到Spring容器的方法上加上一个@LoadBalanced注解即可实现,只是现在被我证实了,当我们使用Ribbon负载均衡后,我们不能再通过拼接ip+port的方法发起调用,只能通过应用名的方式发起远程调用,因为这是Ribbon根据应用名相同采取负载均衡的前提;
-
下面我们来说说我们后面常用的OpenFeign的Ribbon负载均衡,Feign本身也是集成了Ribbon的依赖和自动配置的,在这里我们就要单独的配置Ribbon了,而不是简单的加一个注解
03-provider: ribbon: ConnectTimeout: 250 # 连接超时时间(ms) ReadTimeout: 1000 # 通信超时时间(ms) OkToRetryOnAllOperations: true # 是否对所有操作重试 MaxAutoRetriesNextServer: 1 # 同一服务不同实例的重试次数 MaxAutoRetries: 1 # 同一实例的重试次数
#这个配置是为某个03-provider这个服务配置的局部坏均衡,若要全局,不需要指定服务名,直接ribbon.XXX实现全局配置
Ribbon的负载均衡算法之IRule接口
Ribbon提供了点多钟轮询算法,常见负载均衡算法比如默认的轮询,其他的随机、响应时间加权算法等;
想要修改Ribbon的负载均衡算法,就必须得知道下面这个接口
IRule接口
-
Ribbon的负载均衡算法需要实现IRule接口,该接口中和核心方法就是choose()方法,对服务提供者的选择方式就是在该方法中体现的,该方法就是在所有可用的方法集合中选择一个可用的服务
7个均衡算法
-
RoundRobbinRule:轮询策略
-
BestAvailableRule:选择并发量最小的服务策略
-
AvailabilityFilteringRule:过滤掉不可用的provider,在剩余的provider中采用轮询策略
-
ZoneAvoidanceRule:复合判断provider所在区域的性能及可用性选择服务器
-
RandomRule:随机策略
-
RetryRule:先按照轮询的策略选择服务。若获取失败则在指定的时间内重试,默认500毫秒
-
WeightedResponseTimeRule:权重响应时间策略,根据每个provider的响应时间计算权重,响应时间越快,被选中的几率就越高,刚启动时采用轮询策略,后面就转换为根据选择选择
更换负载均衡算法也很简单,在我们的启动类下将其被我spring容器所管理即可
当然也是使用配置方式配置指定的负载均衡策略:
ribbon:
ReadTimeout: 30000 # 读取超时时间
ConnectTimeout: 10000 # 连接超时时间
SocketTimeout: 30000 # 通讯超时时间
MaxTotalConnections: 1000 # 最大连接数
MaxConnectionsPerHost: 200 # 每个注解最多多少个连接
OkToRetryOnAllOperations: false # 对所有请求都进行重试
MaxAutoRetries: 1 # 对当前实例的重试3次
MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
eager-load:
enabled: true # 开启Feign Client启动加载
eureka:
enabled: true # 开始Eureka
okhttp:
enabled: true # 使用OkHttp
auth:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule
system:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule
当然这是在他规定的集中负载均衡算法中选取,我们也可以自定义算法,但我觉得没有必要,你说是不是?官方都给了7中算法,我们还去自定义算法,是不是不太合适?如果非要使用自定义算法的话,实现IRule接口,重写方法,将其给Spring容器管理。
具体移步:git版本个人spring cloud开源脚手架,快速上手开发