Dubbo源码学习--LoadBalance负载均衡(一)

女爷i 2022-05-29 12:53 249阅读 0赞

在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用。

可以自行扩展负载均衡策略,参见:负载均衡扩展

负载均衡策略

Random LoadBalance

  • 随机,按权重设置随机概率。
  • 在一个截面上碰撞的概率高,但调用量越大分布越均匀,而且按概率使用权重后也比较均匀,有利于动态调整提供者权重。

RoundRobin LoadBalance

  • 轮循,按公约后的权重设置轮循比率。
  • 存在慢的提供者累积请求的问题,比如:第二台机器很慢,但没挂,当请求调到第二台时就卡在那,久而久之,所有请求都卡在调到第二台上。

LeastActive LoadBalance

  • 最少活跃调用数,相同活跃数的随机,活跃数指调用前后计数差。
  • 使慢的提供者收到更少请求,因为越慢的提供者的调用前后计数差会越大。

ConsistentHash LoadBalance

  • 一致性 Hash,相同参数的请求总是发到同一提供者。
  • 当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其它提供者,不会引起剧烈变动。
  • 算法参见:http://en.wikipedia.org/wiki/Consistent_hashing
  • 缺省只对第一个参数 Hash,如果要修改,请配置 <dubbo:parameter key="hash.arguments" value="0,1" />
  • 缺省用 160 份虚拟节点,如果要修改,请配置 <dubbo:parameter key="hash.nodes" value="320" />

配置

服务端服务级别

  1. <dubbo:service interface="..." loadbalance="roundrobin" />

客户端服务级别

  1. <dubbo:reference interface="..." loadbalance="roundrobin" />

服务端方法级别

  1. <dubbo:service interface="...">
  2. <dubbo:method name="..." loadbalance="roundrobin"/>
  3. </dubbo:service>

客户端方法级别

  1. <dubbo:reference interface="...">
  2. <dubbo:method name="..." loadbalance="roundrobin"/>

</dubbo:reference>

``

负载均衡扩展

Dubbo提供了负载均衡的扩展机制

扩展接口:

com.alibaba.dubbo.rpc.cluster.LoadBalance

  1. //默认负载均衡算法是random
  2. @SPI(RandomLoadBalance.NAME)
  3. public interface LoadBalance {
  4. /**
  5. * select one invoker in list.
  6. *
  7. * @param invokers invokers.
  8. * @param url refer url
  9. * @param invocation invocation.
  10. * @return selected invoker.
  11. */
  12. //根据负载均衡算法获取将要调用的Invoker
  13. @Adaptive("loadbalance")
  14. <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException;
  15. }

扩展配置

  1. <dubbo:protocol loadbalance="xxx" />
  2. <!-- 缺省值设置,当<dubbo:protocol>没有配置loadbalance时,使用此配置 -->
  3. <dubbo:provider loadbalance="xxx" />

已知扩展

  • com.alibaba.dubbo.rpc.cluster.loadbalance.RandomLoadBalance
  • com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance
  • com.alibaba.dubbo.rpc.cluster.loadbalance.LeastActiveLoadBalance

扩展示例

Maven 项目结构:

  1. src
  2. |-main
  3. |-java
  4. |-com
  5. |-xxx
  6. |-XxxLoadBalance.java (实现LoadBalance接口)
  7. |-resources
  8. |-META-INF
  9. |-dubbo
  10. |-com.alibaba.dubbo.rpc.cluster.LoadBalance (纯文本文件,内容为:xxx=com.xxx.XxxLoadBalance)

XxxLoadBalance.java:

  1. package com.xxx;
  2. import com.alibaba.dubbo.rpc.cluster.LoadBalance;
  3. import com.alibaba.dubbo.rpc.Invoker;
  4. import com.alibaba.dubbo.rpc.Invocation;
  5. import com.alibaba.dubbo.rpc.RpcException;
  6. public class XxxLoadBalance implements LoadBalance {
  7. public <T> Invoker<T> select(List<Invoker<T>> invokers, Invocation invocation) throws RpcException {
  8. // ...
  9. }
  10. }

META-INF/dubbo/com.alibaba.dubbo.rpc.cluster.LoadBalance:

  1. xxx=com.xxx.XxxLoadBalance

接下来用几篇博客我们分别来了解一下Dubbo官方提供的负载均衡算法。

发表评论

表情:
评论列表 (有 0 条评论,249人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Dubbo - 负载均衡

    前言 负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行。 例如:在Dubbo中,同一个服务有多个服务提

    相关 dubbo解析-LoadBalance

    Dubbo源码解析系列文章均来自肥朝简书 前言 终于到了集群容错中的最后一个关键词,也就是`LoadBalance(负载均衡)`,负载均衡必然会涉及一些算法.但是也不用

    相关 LoadBalance负载均衡【1】

    一、前言 第一次听说负载均衡是在大三,当时对这个没有太大的兴趣,到后来大四找工作面试,也零星的听别人提起过一些,可能因为是校招吧,对现在流行的技术了解的不是很多,到现在工