Dubbo-admin无元数据信息问题

项目场景:

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


问题描述

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

Dubbo-admin无元数据信息问题_第1张图片
Dubbo-admin无元数据信息问题_第2张图片
Dubbo-admin无元数据信息问题_第3张图片
Dubbo-admin无元数据信息问题_第4张图片

原因分析:

消费者语言为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<URL> urls) {
        if (urls == null || urls.isEmpty()) {
            return;
        }
        // Map>>
        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;
                }
            }

你可能感兴趣的:(dubbo,java,开发语言)