环境
spring-boot 2.3.2.RELEASE
dubbo 2.7.8
负载均衡策略
dubbo内置五种负载均衡策略:
- Random 随机(默认)
- RoundRobin 轮询
- LeastActive 最小活跃订阅数
- ConsistentHash 一致性hash
- ShortestResponse 最短响应时间(不知道为啥官网没有文档)
yml配置
在客户端yml可以如下全局配置负载均衡策略
dubbo:
consumer:
loadbalance: RoundRobin ## 使用轮询
注解配置
也可以在引用时配置某个服务的负载均衡策略
@DubboReference(loadbalance = "LeastActive")
自定义策略
也可以自己实现一个负载均衡策略,dubbo是支持SPI扩展的
比如我遇到的场景: 多人开发同一个项目,dubbo注册器共用一个nacos服务,会导致rpc请求发送到别人的电脑上,这个时候需要一个"优先访问本地服务"的负载均衡策略
第一步,实现一个LoadBalance
@Slf4j
public class LocalFirstLoadBalance extends AbstractLoadBalance {
public static final String NAME = "localfirst";
@Override
protected <T> Invoker<T> doSelect(List<Invoker<T>> invokers, URL url, Invocation invocation) {
try {
InetAddress addr = InetAddress.getLocalHost();
// 筛选相同ip的Invoker
Optional<Invoker<T>> self = invokers.stream().filter(v -> v.getUrl().getHost().equals(addr.getHostAddress())).findFirst();
if (!self.isPresent()) {
throw new Exception("no local provider");
}
return self.get();
} catch (Exception e) {
log.error("本地负载出错: {}", e.getMessage());
return invokers.get(0);
}
}
}
第二步,resources目录下新建META-INF.dubbo
文件夹

第三步,在META-INF.dubbo下新建org.apache.dubbo.rpc.cluster.LoadBalance
文件

给自己的自定义负载均衡器起个名字, 比如LocalFirst
,编辑文件内容如下
LocalFirst=com.xxx.xxx.LocalFirstLoadBalance
格式为名称=包名.类名
最后,配置使用自定义负载均衡策略
dubbo:
consumer:
loadbalance: LocalFirst ## 使用LocalFirst负载均衡策略
写这篇文章的主要是目的为了研究Dubbo的SPI机制,留在下一篇介绍
网友评论