配置
1 |
# 开启负载均衡重试 |
如果针对某个服务做负载均衡, 可把 ribbon 配置放在该服务节点下, 比如:
1 |
xxx-server: |
或者使用注解: @RibbonClients, @RibbonClient(name=”xxx-server”, configuration=XXXConfiguration.class)
配置类源码追溯
配置相关 key
com.netflix.client.config.CommonClientConfigKeyribbon ClientConfig 构造器
com.netflix.client.config.IClientConfig.Builder默认值(除 connectTimeout, readTimeout 外, 其他配置都使用该类中的默认值, 前面两个属性在 RibbonClientConfiguration 已经声明)
com.netflix.client.config.DefaultClientConfigImpl
💡:bulb:
这里需要注意一个地方
connectTimeout, readTimeout 如果没有显式配置, 默认值为: 1000, 1000.org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration#DEFAULT_CONNECT_TIMEOUT = 1000
org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration#DEFAULT_READ_TIMEOUT = 1000
初始化 RibbonClientConfig 的位置在 org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration#ribbonClientConfig.有配置的时候,自然使用配置的value, DefaultClientConfigImpl里的默认值然而并没有用到(ps: 应该在其他地方用到了: HttpClientRibbonConfiguration, OkHttpRibbonConfiguration)
这大概就是为什么我们服务(牵涉到三方调用)经常出现超时的原因
负载均衡规则
- ClientConfigEnabledRoundRobinRule 内嵌了一个 RoundRobinRule
- BestAvailableRule 最优可用: 获取其中ActiveRequestsCount最小的服务
- PredicateBasedRule 基于 Predicate 的规则
- ZoneAvoidanceRule 区域去除判定: 判断某个区域的运行性能是否可用, 提出不可用的区域(该区域下的所有服务)
- AvailabilityFilterRule 可用性判定: 过滤掉连接数过多的server
- RoundRobinRule 轮询
- WeightedResponseTimeRule 根据响应时间分配一个weight,响应时间越长,weight越小,被选中的可能性越低
- ResponseTimeWeightTimeRule (??? use WeightedResponseTimeRule instead)
- RandomRule 随机
- RetryRule 重试规则, 失败之后会在指定时间内以subRule继续获取服务, 默认subRule=RoundRobinRule
规则配置方式(以 RetryRule 为例):
- properties方式
1 |
ribbon: |
- java config
1 |
@Bean |
默认规则: com.netflix.loadbalancer.AvailabilityFilteringRule
依赖说明
1 |
<dependency> |