Dubbo之LoadBalance源码分析

前言

LoadBalance,就是负载均衡,那么何为负载均衡,就是让服务提供者相对平摊请求,不要出现请求总落在一个提供者的情况

接口定义

select方法作用是从invokers选出下一个被调用的invoker,具体有哪些策略,如下

然后这个LoadBalance主要使用在Cluster模块中。比如failover选择下一个invoker。

下面开始源码讲解

源码

AbstractLoadBalance

上述4中策略的实现,都会继承AbstractLoadBalance这个模板类,在这个模板类中封装了getWeight方法,获取invoker的权重,特别的是,这个权重和预热时间有关,只有提供者在线时长到达了预热时间,调用这个方法获取invoker权重的时候,才能获得100%的权重。在子类中获取invoker权重都是调用这个方法

看下带有预热逻辑的权重方法

AbstractLoadBalance实现了select方法,增加了对invoker数量的判断,如果只有一个直接返回,invokers超过1个才需要使用负载均衡选择逻辑,具体负载均衡逻辑由子类实现doSelect方法

为什么要预热,jvm运行时会对字节码进行优化,刚启动的字节码肯定不是最优的。或者是提供者本身有其他缓存需要初始化之类的。所以预热是有必要的。不要一启动就和其他提供者承受同样流量,可能效率会变慢。当然,如果只有一个提供者的情况下,预热就失效了。

RandomLoadBalance

随机算法,如果每个invokers权重一样,那么就是普通的随机算法,如果不同就是加权随机

RoundRobinLoadBalance

轮训算法。如果每个invoker权重一样,就是普通的轮训算法。如果不同,是加权的轮训算法。

LeastActiveLoadBalance

最少活跃调用数。如果最小活跃调用数的invokers大于1,如果这些invokers权重相同,采用随机算法选出invoker。如不同,采用加权随机算法。

活跃调用次数会通过ActiveLimitFilter记录在RpcStatus中

ConsistentHashLoadBalance

一致性hash算法。通过调用的参数进行一致性hash,和权重无关。

一致性hash的主要逻辑都在ConsistentHashSelector中,在它的构造函数中会生成虚拟节点。默认每个invoker 160个。hash环的总节点数为2的32次方-1个

然后通过对方法参数的hash去取得对应的invoker

tailMap方法用于取得virtualInvokers中key的hash大于参数hash的子Map,由于virtualInvokers是TreeMap,并且key为long类型,所以子Map的第一个Entry就对应hash环中的相匹配的invoker。

关于一致性hash可以看下面这篇文章(https://www.cnblogs.com/lpfuture/p/5796398.html)

node对应我们的invoker的hash键对应我们参数的hash通过一致性hash,能够保证大部分情况下,参数一致的请求落到同一个提供者。如果提供者发生上下线,只会影响一小部分的请求。

总结

LoadBalance中好多算法,加权随机,加权轮训以及一致性hash真是有意思。大家好好体会这个源码,看懂了,真是很有意思。

最后

希望大家关注下我的公众号

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180731G02FBT00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券