一、概述
-
版本依赖说明:
|spring-boot|spring-cloud|spring-cloud-alibaba| |:----:|:----|----:|:----|----:| |2.0.8.RELEASE|Finchley.SR2|2.0.0.RELEASEE|
-
核心组件
-
负载均衡策略
|策略名|策略描述|实现说明| |:----:|:----|----:|:----|----:| |BestAvailableRule|B选择一个最小的并发请求的server| 逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server| |AvailabilityFilteringRule|过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)|使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态| |WeightedResponseTimeRule|根据相应时间分配一个weight,相应时间越长,weight越小,被选中的可能性越低|一 个后台线程定期的从status里面读取评价响应时间,为每个server计算一个weight。Weight的计算也比较简单responsetime 减去每个server自己平均的responsetime是server的权重。当刚开始运行,没有形成statas时,使用roubine策略选择 server。| |RetryRule|对选定的负载均衡策略机上重试机制。|在一个配置时间段内当选择server不成功,则一直尝试使用subRule的方式选择一个可用的server| |RoundRobinRule|roundRobin方式轮询选择server|轮询index,选择index对应位置的server| |RandomRule |随机选择一个server|在index上随机,选择index对应位置的server| |ZoneAvoidanceRule|复合判断server所在区域的性能和server的可用性选择server|使 用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个 zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的 Server。|
二、配置说明
Ribbon配置由
RibbonClientConfiguration进行读取设置,可以选择JavaBean方式,也可以使用配置文件配置,推荐使用配置文件的方式。(有时候可能会出现意想不到的问题,我在配置超时时间的时候,发生HttpClient的IO异常,不清楚是什么原因。)
-
默认的配置实现:
|Bean Type |Bean Name|Class Name| |:----:|:----|----:|:----|----:| |IClientConfig|ribbonClientConfig|DefaultClientConfigImpl| |IRule|ribbonRule|ZoneAvoidanceRule| |IPing|ribbonPing|DummyPing| |ServerList|ribbonServerList|ConfigurationBasedServerList| |ServerListFilter|ribbonServerListFilter|ZonePreferenceServerListFilter| |ILoadBalancer|ribbonLoadBalancer|ZoneAwareLoadBalancer| |ServerListUpdater|ribbonServerListUpdater|PollingServerListUpdater|
-
文件的配置方式
- 服务粒度的配置
<service-provider-id>.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RoundRobinRule-
全局配置
存疑
-
JavaBean配置
请参阅官网
三、关于Ribbon的超时重试配置
在我使用的版本中必须先开启 ribbon.http.client.enabled=true,否则以下配置不生效。
|配置项|配置说明|缺省值|
|:----|----:|:----|----:|
|ConnectTimeout|http建立socket超时时间,毫秒|1000|
|ReadTimeout|http读取响应socket超时时间|1000|
|MaxAutoRetries|同一台实例最大重试次数,不包括首次调用|--|
|MaxAutoRetriesNextServer|负载均衡其他的实例最大重试次数|--|
|OkToRetryOnAllOperations|是否所有操作都重试,POST请求注意幂等问题.|默认false,只有get请求会重试|
|retryableStatusCodes|对Http响应码进行重试|--|
四、其他
DynamicServerListLoadBalancer封装了所有配置项,负载均衡策略等信息,可以断点查看。
2019年10月1日更新:
- ribbon不支持配置文件全局配置非常坑爹,只能是服务粒度的,全局配置必须使用javaBean配置
使用nacos作为注册中心时,动态增加服务实例时有问题,不清楚是否和nacos有关,动态增加服务必须重启客户端- 再次测试的时候发现同一个服务,两个实例,使用轮询负载均衡的时候一个实例超时,尽然没有办法自动负载到另一实例上。这里存疑