美文网首页dubbo
Dubbo自定义负载均衡策略

Dubbo自定义负载均衡策略

作者: pq217 | 来源:发表于2022-07-27 19:08 被阅读0次

环境

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
第三步,在META-INF.dubbo下新建org.apache.dubbo.rpc.cluster.LoadBalance文件
org.apache.dubbo.rpc.cluster.LoadBalance

给自己的自定义负载均衡器起个名字, 比如LocalFirst,编辑文件内容如下

LocalFirst=com.xxx.xxx.LocalFirstLoadBalance

格式为名称=包名.类名

最后,配置使用自定义负载均衡策略
dubbo:
  consumer:
    loadbalance: LocalFirst ## 使用LocalFirst负载均衡策略

写这篇文章的主要是目的为了研究Dubbo的SPI机制,留在下一篇介绍

相关文章

网友评论

    本文标题:Dubbo自定义负载均衡策略

    本文链接:https://www.haomeiwen.com/subject/uzrzirtx.html