Dubbo-admin无元数据信息问题

项目场景:

使用dubbo-admin 0.3.0时显示无元数据信息,可关于config-center的配置已经按官网那样配置了。


问题描述

集群中存在dubbo-go作为xxx服务的consumer时,会注册到dubbo-admin上,dubbo-admin却认为它是provider,点击对应的服务测试后,真正的provider信息被覆盖,服务不能再被调用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原因分析:

消费者语言为go,用的是dubbo-go,从url中看到registry url 中 protocol和side均为consumer

consumer😕//com.xxx.service.api.CustomerApi?app.version=1.0.0&application=xxx&async=false&bean.name=ServiceBean:com.xxx.service.api.CustomerApi:1.0.0&check=false&cluster=failover&environment=environment&generic=false&group=group&interface=com.xxx.service.api.CustomerApi&ip=10.46.19.116&loadbalance=loadbalance&methods.findCustomerByTeamUid.loadbalance=methods.findCustomerByTeamUid.loadbalance&methods.findCustomerByTeamUid.retries=1&methods.findCustomerByTeamUid.sticky=false&methods.getPrimaryServiceGroupByCustomerUid.loadbalance=methods.getPrimaryServiceGroupByCustomerUid.loadbalance&methods.getPrimaryServiceGroupByCustomerUid.retries=1&methods.getPrimaryServiceGroupByCustomerUid.sticky=false&module=dubbo-go client&name=xxx&organization=dubbo.io&owner=owner&protocol=rest&provided-by=provided-by&reference.filter=cshutdown&registry.role=0&release=dubbo-golang-1.5.6&retries=retries&side=consumer&sticky=false&version=1.0.0

查看源码发现:第一次invoke方法后,dubbo-admin的RegistryServerSync.notify方法会收到zk发来的消息

   public void notify(List<URL> urls) {
        if (urls == null || urls.isEmpty()) {
            return;
        }
        // Map<category, Map<servicename, Map<Long, URL>>>
        final Map<String, Map<String, Map<String, URL>>> categories = new HashMap<>();
        String interfaceName = null;
        for (URL url : urls) {
            String category = url.getUrlParam().getParameter(Constants.CATEGORY_KEY);
            // 注意这里,category如果为null则默认是providers,而上面的url中是不存在category这个key的
            if (category == null) {
                category = Constants.PROVIDERS_CATEGORY;
            }
            // 省略无关代码
            ......

解决方案:

增加逻辑:如果 side是consumer 或者 protocol是consumer时,category是consumers

        for (URL url : urls) {
            String category = url.getUrlParam().getParameter(Constants.CATEGORY_KEY);
            if (category == null) {
                // 增加逻辑,如果side是consumer 或者 side为null,protocol是consumer时 category是consumers
                if ("consumer".equals(url.getSide()) || "consumer".equals(url.getProtocol())) {
                    category = Constants.CONSUMERS_CATEGORY;
                } else {
                    category = Constants.PROVIDERS_CATEGORY;
                }
            }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值