0%

Spring Cloud —— Ribbon 负载均衡策略

最近在看 Spring Cloud,买了本翟永超的《Spring Cloud 微服务实战》,感觉里面讲的挺详细的,只是书本里面的版本相对于官网来说,还是有些落后的,不过作为入门书籍还是可以的。

今天在一个公众号里面看到一篇面试的文章,里面有一个问题问的是负载均衡,于是想起了 Spring Cloud 的 Ribbon 负载均衡策略。在Spring Cloud Ribbon 中,RestTemplate 使得 Ribbon实现了自动化配置,同时通过 @LoadBalanced 还能开启客户端负载均衡。打算好好的整理下关于负载均衡的算法策略,梳理下用的比较多的几种。

在Spring Cloud 中,负载均衡策略都是 继承 AbstractLoadBalancerRule

轮询策略(默认,RoundRobinRule)

轮询策略标识每次都顺序取下一个 provider,比如一共有5个,第1次去第1个,第2次取第2个,以此类推。

随机策略(RandomRule)

该策略实现了从服务实例清单中随机选择一个服务实例功能。

权重轮询策略(WeightedResponseTimeRule)

该策略是对 RoundRobinRule 的扩展,增加了根据实例的运行情况来计算权重,并根据权重来挑选实例,已达到更优的分配效果,响应时间越长,权重越小,被选中的可能性越小。

它的核心:

  • 定时任务:启动一个定时任务,用来为每个服务实例计算权重,该任务默认时间30秒执行一次。
  • 权重计算:1、根据 LoadBalancerStats 中记录的每个实例的统计信息,累加所有实例的平均响应时间,得到总平均响应时间 totalResponseTime,该值会用于后面计算。2、为负载均衡器中维护的实例清单逐个计算权重,计算规则为 weightSoFar+totalResponseTime —— 实例的平均响应时间,其中 weightSoFar 初始化为零,并且每计算好一个权重需要累加到weightSoFar上供下次计算。
  • 实例选择

原理:一开始为轮询策略,并开启一个计时器,每30秒收集一次每个provider的平均响应时间,当信息足够时,给每个provider 附上一个权重,并按权重随机选择 provider,权重越高,选中几率越大。

最少并发数策略(BestAvailableRule)

选择正在请求中的兵书最小的 provider,除非这个 provider 在熔断中。

在“选定的负载均衡策略”基础上进行重试机制(RetryRule)

该策略具备重试机制的实例选择功能。“选定的负载均衡策略”是轮询策略,改该重试策略先设定一个阈值时间段,如果在这个阈值时间段内,选择的 provider 不超过,则一直尝试采用“选定的负载均衡策略”:轮询策略,最后选择一个可用的 prov。

可用性敏感策略(AvailabilityFilteringRule)

继承抽象出来 PredicateBaseRule,继承了“先过滤清单,在轮询选择”的基本出来逻辑。

主要判断服务实例中下面的内容:

  • 是否故障,即断路器是否生效已断开。
  • 实例的并发请求数是否大于阈值,默认值为 2^32 - 1,该参数可通过参数 <clientName>.<nameSpace>.ActiveConnectionsLimit 来修改。

区域敏感性策略(ZoneAvoidanceRule)

以一个区域为单位考察可用性,对于不可用的区域整个丢弃,从剩下的 provider 中选择。如果这个ip 区域内有一个或者多个实例不可达或反应变慢,会降低 ip 区域内其他 ip 被选中的权重。

客官,赏一杯coffee嘛~~~~