我默认楼主用了feign和springboot。
可以运行时修改,它启动后,在发生了真正request时,对每个目标serviceid 都建立了一个子ApplicationContext,里面存着你 @RibbonClient里面的config,所以你要修改哪个目标serviceid的负载算法,就要找到这个子context,并设置。
首先:
@Autowired
private SpringClientFactory springClientFactory;
这东西存着所有子context
然后
IRule rule = springClientFactory.getInstance(ribbon目标服务名, IRule.class);
来获取你的rule,这个是获取,想修改的话,你应该已经直到怎么做了。、
并且请注意,ribbon适合在容器云环境跑负载均衡,它弱化了IP的概念,目前存在的算法有:
ruleDes.put("RoundRobinRule", "轮训(默认)");
ruleDes.put("BestAvailableRule", "选择一个最小的并发请求的server");
ruleDes.put("AvailabilityFilteringRule", "过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的server");
ruleDes.put("ZoneAvoidanceRule", "复合判断server所在区域的性能和server的可用性选择server");
ruleDes.put("RandomRule", "随机选择");
ruleDes.put("RetryRule", "对轮训的负载均衡策略机上重试机制");
ruleDes.put("WeightedResponseTimeRule", "根据响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性越低");
ruleDes.put("ConsistentHashRule", "hash一致性规则,如果http请求的header中存在一个key['rest_consistent_key'],则按它的value进行一致性hash选择相同的那个server,如果不存在,则使用服务启动时随机生成的一个字符串作为key。");
复杂算法描述:
BestAvailableRule :
最佳使用性规则,选择正在请求中的并发数最小的那个server,除非这个server在熔断中。
ZoneAvoidanceRule:
区域敏感性规则,如果这个ip区域内有一个或多个实例不可达或响应变慢,都会降低该ip区域内其他ip被选中的权重。
AvailabilityFilteringRule:
可用性敏感规则,首先轮询选择一个server,如果该server没有熔断并且正在请求中的数量没有达到限制,则选中它。
WeightedResponseTimeRule:
响应平均值规则,起始为轮训算法,并开启一个计时器,每三十秒收集一次每个server的平均响应时间,当信息足够时,给每个server附上一个权重,并按权重随机选择server,高权重的server会被高概率选中。
ConsistentHashRule:
hash一致性规则,如果http请求的header中存在一个key['rest_consistent_key'],则按它的value进行一致性hash选择相同的那个server,如果不存在,则使用服务启动时随机生成的一个字符串作为key。
个人建议使用加权响应平均值算法,比较好,特别是云环境你的微服务不一定被编排到哪个破server上,他可能是高io消耗的宿主机,会严重影响服务响应时间,所以WeightedResponseTimeRule算法较好的解决这个问题。