升级 dubbo 小心 default.version

简介: 上周遇到个关于升级dubbo 2.6 到2.7的兼容性问题,差点造成线上故障,这里记录下,也给大家提个醒。

上周遇到个关于升级dubbo 2.6 到2.7的兼容性问题,差点造成线上故障,这里记录下,也给大家提个醒。


问题回放


有一个接口的提供方(dubbo 2.6.6)这么配置接口的版本号


<dubbo:provider version="1.0.0"/>


消费方(也是dubbo 2.6.6)的reference这么配置


<dubbo:reference id="sampleService" version="1.0.0" check="false" interface="com.newboo.basic.api.SampleService"/>


然后升级消费方的dubbo版本,经过一通操作将消费者升级到dubbo 2.7.3,预发测试时发现调用报No provider,还好是在测试时发现,不然后果不堪设想


No provider available from registry 127.0.0.1:2181


根因分析


查看注册到注册中心的URL是这样


dubbo://10.0.0.6:20880/com.newboo.basic.api.SampleService?anyhost=true&application=ddog-provider-this-two&bind.ip=10.0.0.6&bind.port=20880&default.version=1.0.0&dubbo=2.0.2&generic=false&interface=com.newboo.basic.api.SampleService&methods=getByUid&owner=roshilikang&pid=82799&qos.accept.foreign.ip=true&qos.enable=true&side=provider&timestamp=1616848403414


可以看到它没有version字段,取而代之的是default.version字段


看一下dubbo中匹配version这个逻辑,位置在org.apache.dubbo.common.utils.UrlUtils类的isMatch方法,摘出重点部分


String consumerGroup = consumerUrl.getParameter(GROUP_KEY);
String consumerVersion = consumerUrl.getParameter(VERSION_KEY);
String consumerClassifier = consumerUrl.getParameter(CLASSIFIER_KEY, ANY_VALUE);
String providerGroup = providerUrl.getParameter(GROUP_KEY);
String providerVersion = providerUrl.getParameter(VERSION_KEY);
String providerClassifier = providerUrl.getParameter(CLASSIFIER_KEY, ANY_VALUE);
return (ANY_VALUE.equals(consumerGroup) || StringUtils.isEquals(consumerGroup, providerGroup) || StringUtils.isContains(consumerGroup, providerGroup))
        && (ANY_VALUE.equals(consumerVersion) || StringUtils.isEquals(consumerVersion, providerVersion))
        && (consumerClassifier == null || ANY_VALUE.equals(consumerClassifier) || StringUtils.isEquals(consumerClassifier, providerClassifier));


逻辑很简单,就是provider和consumer URL上的version字段得匹配上,提供者没有version字段,只有default.version字段,很显然调用时报错。


但之前2.6.6是没有问题的,为什么?看了下2.6.6的实现,代码也是一样,但点进providerUrl.getParameter(VERSION_KEY);,发现它的实现不简单


public String getParameter(String key) {
    String value = parameters.get(key);
    if (value == null || value.length() == 0) {
        value = parameters.get(Constants.DEFAULT_KEY_PREFIX + key);
    }
    return value;
}


先取key对应的值,取不到时,再加个前缀default.取一次,也就是说versiondefault.version两者只要有一个有值即可(version优先)。


反观2.7.3的实现就非常耿直


public String getParameter(String key) {
    return parameters.get(key);
}


所以,这就直接导致了2.7.3调用2.6.6的default.version接口报错,类似的group也存在这个问题,甚至还有一些如timeout等参数都可能会失效。


这个问题还是比较明显,应该有人遇到,搜索了一下github,果然让我找到了相关的issue


2379072-20211101125041450-699071628.png


来自:https://github.com/apache/dubbo/issues/5948


这个issue有一个相关联的修复,说是2.7.7已经修复了这个问题,于是我测试了一下2.7.7,很遗憾,还是报错,看了下修复代码


2379072-20211101125047673-549064463.png


和2.6.6的兼容不一样,这里修复是在 URL 类的 valueOf 方法中添加兼容逻辑,修复者想的是所有注册中心上的URL字符串最终得经过这个方法才能成为URL对象,才能为dubbo所用。


想法是没错,但通过调试发现并不是每个URL对象都来自valueOf方法,2.7.7中订阅时对提供者的URL进行处理的是URLStrParser类的parseEncodedStr方法,所以这个修复就是无效的了。






相关文章
|
9月前
|
Dubbo Cloud Native Java
干翻Dubbo系列第二篇:Dubbo3相对其他版本的升级
干翻Dubbo系列第二篇:Dubbo3相对其他版本的升级
|
Dubbo 应用服务中间件 API
Go语言微服务框架重磅升级:dubbo-go v3.2.0 -alpha 版本预览
随着 Dubbo3 在云原生微服务方向的快速发展,Dubbo 的 go 语言实现迎来了 Dubbo3 版本以来最全面、最大幅度的一次升级,这次升级是全方位的,涉及 API、协议、流量管控、可观测能力等。
|
JSON Dubbo JavaScript
Dubbo Triple 协议重磅升级:支持通过 HTTP 连通 Web 与后端微服务
Dubbo Triple 协议重磅升级:支持通过 HTTP 连通 Web 与后端微服务
1011 16
|
9月前
|
XML Dubbo Java
SpringBoot整合Dubbo和Zookeeper升级版
SpringBoot整合Dubbo和Zookeeper升级版
93 0
|
Dubbo Cloud Native Java
带你读《Apache Dubbo微服务开发从入门到精通》—— 一、 平滑升级到Dubbo3版本(上)
带你读《Apache Dubbo微服务开发从入门到精通》—— 一、 平滑升级到Dubbo3版本(上)
209 9
|
JSON Dubbo JavaScript
Dubbo3 Triple 协议重磅升级:支持通过 HTTP 连通Web与后端微服务
阿里 [HSF2 框架已经完成到 Dubbo3 的全面升级](https://ata.atatech.org/articles/11000209827?spm=ata.25287382.0.0.26577536vUxJq6),阅读本文了解 Triple 协议工作原理。更多技术内容分享,请参见[官网博客](https://cn.dubbo.apache.org/zh-cn/blog/) ## 全新
446 0
Dubbo3 Triple 协议重磅升级:支持通过 HTTP 连通Web与后端微服务
|
Dubbo Java 应用服务中间件
带你读《Apache Dubbo微服务开发从入门到精通》—— 一、 平滑升级到Dubbo3版本(下)
带你读《Apache Dubbo微服务开发从入门到精通》—— 一、 平滑升级到Dubbo3版本(下)
180 12
|
编解码 监控 负载均衡
平安健康 Dubbo 3 升级、迁移和验证之路
升级项目有了阶段性的进展,目前仍然在进行中。通过本⽂,我们对公司内部的 Dubbo 3 升级过程及收益等做了深⼊总结。
229 3
平安健康 Dubbo 3 升级、迁移和验证之路
|
Cloud Native Dubbo NoSQL
云小蜜 Dubbo3 Triple 协议升级及使用经验总结
# 前言 阿里云-达摩院-云小蜜对话机器人产品基于深度机器学习技术、自然语言理解技术和对话管理技术,为企业提供多引擎、多渠道、多模态的对话机器人服务。17年云小蜜对话机器人在公共云开始公测,同期在混合云场景也不断拓展。为了同时保证公共云、混合云发版效率和稳定性,权衡再三我们采用了1-2个月一个大版本迭代。 经过几年发展,为了更好支撑业务发展,架构升级、重构总是一个绕不过去的坎,为了保证稳定性每次公
476 0
云小蜜 Dubbo3 Triple 协议升级及使用经验总结
|
XML Dubbo Cloud Native
架构设计91-闲聊03-01.记一次Dubbo升级
架构设计91-闲聊03-01.记一次Dubbo升级
271 0