Dubbo配置参数源码解析-group
Dubbo的配置丰富,功能强大,但是网上的教程多为复制粘贴,鱼龙混杂。本着不轻信,不盲从,眼见为实的态度,本系列教程将从源代码的角度分析各配置项的作用。本章将对version,group参数进行分析。
1.version,group有什么用?
version,group可以用于灰度发布,用来区分版本,只有相同版本的Consumer才能调用Provider。
比如笔者最近所在的项目需要在内网增加preview环境,就是使用group实现的:
生产环境设置@Service(group="prod"),@Reference(group="prod");
灰度环境设置@Service(group="preview"),@Reference(group="preview");
画外音:如果希望Consumer可以调用所有版本的Provider,只需要设置group="*"或version="*";
2.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));
}
}
References
[1]
分组聚合: http://dubbo.apache.org/zh-cn/docs/user/demos/group-merger.html[2]
多版本: http://dubbo.apache.org/zh-cn/docs/user/demos/multi-versions.html
近期热文