前言
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真是有意思。大家好好体会这个源码,看懂了,真是很有意思。
最后
希望大家关注下我的公众号
领取专属 10元无门槛券
私享最新 技术干货