在集群负载均衡时,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" />​

配置

服务端服务级别

<dubbo:service interface="..." loadbalance="roundrobin"

客户端服务级别

<dubbo:reference interface="..." loadbalance="roundrobin"

服务端方法级别

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

客户端方法级别

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

​</dubbo:reference>​


负载均衡扩展

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

扩展接口:

com.alibaba.dubbo.rpc.cluster.LoadBalance

//默认负载均衡算法是random
@SPI(RandomLoadBalance.NAME)
public interface LoadBalance {

/**
* select one invoker in list.
*
* @param invokers invokers.
* @param url refer url
* @param invocation invocation.
* @return selected invoker.
*/
//根据负载均衡算法获取将要调用的Invoker
@Adaptive("loadbalance")
<T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException;

}

扩展配置

<dubbo:protocol loadbalance="xxx"
<!-- 缺省值设置,当<dubbo:protocol>没有配置loadbalance时,使用此配置 -->
<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 项目结构:

src
|-main
|-java
|-com
|-xxx
|-XxxLoadBalance.java (实现LoadBalance接口)
|-resources
|-META-INF
|-dubbo
|-com.alibaba.dubbo.rpc.cluster.LoadBalance (纯文本文件,内容为:xxx=com.xxx.XxxLoadBalance)

XxxLoadBalance.java:

package com.xxx;

import com.alibaba.dubbo.rpc.cluster.LoadBalance;
import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.Invocation;
import com.alibaba.dubbo.rpc.RpcException;

public class XxxLoadBalance implements LoadBalance{
public <T> Invoker<T> select(List<Invoker<T>> invokers, Invocation invocation) throws{
// ...

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

xxx=com.xxx.XxxLoadBalance

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