vlambda博客
学习文章列表

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

近期热文