Dubbo配置参数详解-version,group

Dubbo配置参数详解-version,group

Dubbo是一个由阿里开源的服务治理框架,笔者的公司重度使用Dubbo。Dubbo开源这么多年,配置项已经非常丰富,了解各个配置项的作用也变得非常重要,本系列将从源代码的角度分析Dubbo目前的最新版本(2.7.4)各个常用的配置项的具体含义以及是怎么起作用的。

画外音:目前Dubbo在开源中国举办的2019年度最受欢迎中国开源软件中排名第3名,支持Dubbo的朋友可以去投票哇。2019年度最受欢迎中国开源软件

version,group有什么用?

version,group默认都是"";
当你的服务需要区分环境的时候,这两个参数就派上用场了;
比如笔者最近所在的项目需要在内网增加preview环境,就是使用group实现的;
生产环境设置@Service(group="prod"),@Consumer(group="prod");
灰度环境设置@Service(group="preview"),@Consumer(group="preview");

可以设置消费者支持所有版本的服务提供者,只需要设置group="*"或version="*";

version,group在代码中是如何生效的?

当消费者启动,拉取服务列表时,或者服务提供者列表发生变化时,消费者端会判断拉取到的服务提供者是否是跟自己的版本一致。具体代码在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", "*");
            //判断Consumer与Provider的group,version,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));
        }
    }

画外音:不要问我classifier是什么,我没有找到设置的地方,如果么有设置这个参数,对应用没有任何影响

你可能感兴趣的:(Dubbo配置参数详解-version,group)