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
近期热文
