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是什么,我没有找到设置的地方,如果么有设置这个参数,对应用没有任何影响