dubbo泛化调用导致zk中同一个消费者节点数递增

本文详细讨论了在使用Dubbo 2.6.8版本时,泛化调用可能导致Zookeeper中消费者节点数量异常增加的问题。当尝试调用不存在的服务时,虽然会抛出异常,但consumer节点已在注册过程中创建。大量此类调用会持续增加ZK负载。测试代码展示了问题的触发场景,并提出了可能的解决方案,如在调用前检查服务存在性或手动销毁引用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dubbo2.6.8 泛化调用导致zk中同一个消费者节点数递增

泛化调用时,如果检查服务是否存在,服务不存在就会抛出异常,但是在此之前consumer节点已经创建,这样只要大量泛化调用这个不存在的服务,就会导致ZK上的consumer节点越来越多,给ZK造成性能问题
在这里插入图片描述
com.alibaba.dubbo.registry.zookeeper.ZookeeperRegistry#doRegister
在这里插入图片描述

com.alibaba.dubbo.config.ReferenceConfig
在这里插入图片描述

测试代码

@Component
public class DubboGenericInvoker {

    @Autowired
    private ApplicationConfig application;

    @Autowired
    private RegistryConfig registry;

    public Object invoker(String id, String tag) {

        if (StringUtils.hasText(tag)) {
            RpcContext.getContext().setAttachment(Constants.TAG_KEY, tag);
        }

        ReferenceConfig<GenericService> reference = new ReferenceConfig<>();
        reference.setApplication(application);
        reference.setRegistry(registry);
        reference.setInterface("com.bruce.rpc.service.DubboService");
        reference.setGeneric(true); // 声明为泛化接口

        //reference.setCheck(false);

        try {
            ReferenceConfigCache cache = ReferenceConfigCache.getCache();
            GenericService genericService = cache.get(reference);
            Object o = genericService.$invoke("finfById", new String[]{"java.lang.String"}, new Object[]{id});
            return o;

        } catch (Exception ex) {
            ex.printStackTrace();
            //reference.destroy();
        }
        return "aaa";
    }
}
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值