栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Dubbo-admin无元数据信息问题

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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®istry.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 urls) {
        if (urls == null || urls.isEmpty()) {
            return;
        }
        // Map>>
        final Map>> 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;
                }
            }
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/996247.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号