Dubbo负载均衡

LoadBalance负载均衡, 负责从多个 Invokers当选出具体的1个Invoker用于本次调用,调用进程中包括了负载均衡的算法,调用失败后需要重新选择

LoadBalance接口定义

@SPI(RandomLoadBalance.NAME)

public interface LoadBalance{

@Adaptive("loadbalance")

<T> Invoker<T> select(List<Invoker<T>> invokers,URL url, Invocation invocation)throws RpcException;

}

类注解@SPI说明可以基于Dubbo的扩大机制进行自定义的负责均衡算法实现,默许是随机算法

方法注解@Adaptive说明能够生成设配方法

Select方法设配类通过url的参数选择具体的算法, 在从invokers集合中根据具体的算法选择1个invoker

 \

 

1. RandomLoadBalance: 随机访问策略,按权重设置随机几率,是默许策略

1)获得所有invokers的个数

2)遍历所有Invokers, 获得计算每一个invokers的权重,并把权重累计加起来

每相邻的两个invoker比较他们的权重是不是1样,有1个不1样说明权重不均等

3)总权重大于零且权重不均等的情况下

按总权重获得随机数offset = random.netx(totalWeight);

遍历invokers肯定随机数offset落在哪一个片断(invoker上)

\


4)权重相同或总权重为0, 根据invokers个数均等选择

invokers.get(random.nextInt(length))

 

      

2. RoundRobinLoadBalance:轮询,按公约后的权重设置轮询比率

1)获得轮询key  服务名+方法名

获得可供调用的invokers个数length

设置最大权重的默许值maxWeight=0

设置最小权重的默许值minWeight=Integer.MAX_VALUE

2)遍历所有Inokers,比较出得出maxWeight和minWeight

3)如果权重是不1样的

根据key获得自增序列

自增序列加1与最大权重取模默许得到currentWeigth

遍历所有invokers挑选出大于currentWeight的invokers

设置可供调用的invokers的个数length

4)自增序列加1并与length取模,从invokers获得invoker

 

 

3. LeastActiveLoadBalance: 最少活跃调用数, 相同的活跃的随机选择,

活跃数是指调用前后的计数差, 使慢的提供者收到更少的要求,由于越慢的提供者前后的计数差越大。

活跃计数的功能消费者是在ActiveLimitFilter中设置的

\


4. 最少活跃的选择进程以下:

1)获得可调用invoker的总个数

初始化最小活跃数,相同最小活跃的个数

相同最小活跃数的下标数组

等等

2)遍历所有invokers, 获得每一个invoker的获得数active和权重

找出最小权重的invoker

如果有相同最小权重的inovkers, 将下标记录到数组leastIndexs[]数组中

累计所有的权重到totalWeight变量

3)如果invokers的权重不相等且totalWeight大于0

按总权重随机offsetWeight = random.nextInt(totalWeight)

计算随机值在哪一个片断上并返回invoker

\

4)如果invokers的权重相等或totalWeight等于0,均等随机

 

 

5. ConsistentHashLoadBalance:1致性hash, 相同参数的要求总是发到同1个提供者,当某1台提供者挂时,本来发往该提供者的要求,基于虚拟节点,平摊到其它提供者,不会引发剧烈变动。对1致性哈希算法介绍网上很多
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值