Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

请问,兼容环境下找不到provider,如何排查? #6903

Open
dslztx opened this issue Nov 13, 2020 · 7 comments
Open

请问,兼容环境下找不到provider,如何排查? #6903

dslztx opened this issue Nov 13, 2020 · 7 comments
Assignees

Comments

@dslztx
Copy link

dslztx commented Nov 13, 2020

Provider是2.6.5
Consumer想要升级成2.7.8,然后提示找不到Provider,2.6.5的Dubbo是能找到这个Provider的,请问有什么排查路径吗?

@horizonzy
Copy link
Member

关注下AbstractRegistry的notify方法,看看服务发现的提供者的url有没有。

@dslztx
Copy link
Author

dslztx commented Nov 17, 2020

服务者URL已经正常注册的了,2.6.5的dubbo consumer能够正常找到的

@horizonzy
Copy link
Member

服务者URL已经正常注册的了,2.6.5的dubbo consumer能够正常找到的

所以要排查。先看服务发现的providerUrl有没有,再看consumer这边是否正确生成invoker了,再看RPC时,最终为啥没有找到invokers

@dslztx
Copy link
Author

dslztx commented Nov 18, 2020

恩,已经找到原因了,本质是org.apache.dubbo.common.URL类下的getParameter(String key)方法没有像旧版本兼容value = (String)this.parameters.get("default." + key);

@horizonzy
Copy link
Member

恩,已经找到原因了,本质是org.apache.dubbo.common.URL类下的getParameter(String key)方法没有像旧版本兼容value = (String)this.parameters.get("default." + key);

这个是哪个环节的,能否贴下代码。在mergeUrl的时候吗?

@dslztx
Copy link
Author

dslztx commented Nov 18, 2020

org.apache.dubbo.registry.zookeeper.ZookeeperRegistry类下的doSubscribe(final URL url, final NotifyListener listener)()方法,里面有个比对过程,this.toUrlsWithEmpty(url, path, children);
然后就是拿所有的生产者url和当前的消费者url去对比,由于getParameter(String key)没有兼容,就会造成group等比对不上,导致获取不到合法的生产者url

@dslztx
Copy link
Author

dslztx commented Nov 18, 2020

核心代码就是org.apache.dubbo.common.utils.UrlUtils类下的isMatch()方法

public static boolean isMatch(URL consumerUrl, URL providerUrl) {
        String consumerInterface = consumerUrl.getServiceInterface();
        String providerInterface = providerUrl.getServiceInterface();
        if (!"*".equals(consumerInterface) && !"*".equals(providerInterface) && !StringUtils.isEquals(consumerInterface, providerInterface)) {
            return false;
        } else if (!isMatchCategory(providerUrl.getParameter("category", "providers"), consumerUrl.getParameter("category", "providers"))) {
            return false;
        } else if (!providerUrl.getParameter("enabled", true) && !"*".equals(consumerUrl.getParameter("enabled"))) {
            return false;
        } else {
            String consumerGroup = consumerUrl.getParameter("group");
            String consumerVersion = consumerUrl.getParameter("version");
            String consumerClassifier = consumerUrl.getParameter("classifier", "*");
            String providerGroup = providerUrl.getParameter("group");
            String providerVersion = providerUrl.getParameter("version");
            String providerClassifier = providerUrl.getParameter("classifier", "*");
            return ("*".equals(consumerGroup) || StringUtils.isEquals(consumerGroup, providerGroup) || StringUtils.isContains(consumerGroup, providerGroup)) && ("*".equals(consumerVersion) || StringUtils.isEquals(consumerVersion, providerVersion)) && (consumerClassifier == null || "*".equals(consumerClassifier) || StringUtils.isEquals(consumerClassifier, providerClassifier));
        }
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants