聊聊dubbo协议2
本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star。
在《聊聊dubbo协议》中介绍了attachments在consumer和provider间的传递情况,有个疑问没有给出答案。
为什么2.7.x版本的dubbo不支持provider端向consumer端回传隐式参数呢?今天的续集将揭晓答案。
抓包确定是provider没发还是consumer丢掉
以下测试基于dubbo 2.7.6版本
在provider端加入下面的代码
RpcContext.getServerContext().setAttachment("hello", "from_provider");
运行provider,并用consumer不断地调用,同时进行抓包
sudo tcpdump -i any -vv -A -n port 20880
可以看到provider端将我们的参数回传了回去,说明是consumer端将数据“弄丢了”

分析2.6.x与2.7.x代码的差别
consumer在收到provider的请求返回时,处理流程如下:
DecodeableRpcResult->decode->case DubboCodec.RESPONSE_VALUE_WITH_ATTACHMENTS->handleAttachment

断点调试能看到,在DecodeableRpcResult中是存在隐式参数的。
看下2.6.x的实现


RpcResultt的attachments通过filter塞到RpcContext中去,这样我们就能拿到隐式参数了。
而在2.7.x中,Result的attachments没有被使用到

虽然参数传了过来,但consumer端没有将它放入RpcContext中,就没法使用。
为什么2.7.x不处理呢?
在2.6.x中,dubbo的请求返回对象只有RpcResult

而在2.7.x中,RpcResult没了,新增了AsyncRpcResult和AppResponse,AppResponse是真实的返回数据,它的attachments是存在隐式参数的,但它会被包装在AsyncRpcResult中,invoke拿到的是AsyncRpcResult,此时从AppResponse中解出数据时丢了attachments。

2.7.x中有一个重要的提升是对异步的支持更加友好,这里对RpcResult的重构应该就是丢失隐式参数的原因。
dubbo协议如何处理协议的兼容的?
从RmiProtocol类中能看到dubbo针对2.7.0、2.6.3两个边界进行了版本兼容

版本信息从哪里来呢?从代码中看到,从provider的url中获取参数release(优先)、dubbo来判断provider的dubbo版本,
dubbo://127.0.0.1:20880/com.newbooo.basic.api.SampleService?anyhost=true&application=ddog-provider&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&interface=com.newbooo.basic.api.SampleService&methods=getByUid&owner=roshilikang&pid=96150&release=2.7.6&retries=7&side=provider×tamp=1614235399505
这里面有些历史原因,看dubbo 2.6.x的源码会发现,在2.6.3版本之前,url中dubbo参数代表的是dubbo的版本,而在2.6.3及以后的版本中,dubbo参数代表的是dubbo协议的版本。

[2.5.3, 2.6.3)版本中,dubbo版本与dubbo协议没有分开,都是用url上的dubbo参数,值是对应的版本号,取值范围是>=2.0.0 && <=2.6.2[2.6.3, 2.7.0)版本,无法从provider注册的url上看出dubbo版本,dubbo协议版本是从url的dubbo参数获取,固定为2.0.22.7.0之后的版本,dubbo版本在provider的url release参数上,dubbo协议版本在dubbo参数上,目前还是2.0.2
最后
通过这次分析知道了2.7.x的dubbo为什么provider不能带回隐式参数了,这应该是个bug。
搜索关注微信公众号"捉虫大师",后端技术分享,架构设计、性能优化、源码阅读、问题排查、踩坑实践。
聊聊dubbo协议2的更多相关文章
- 聊聊dubbo协议
搜索关注微信公众号"捉虫大师",后端技术分享,架构设计.性能优化.源码阅读.问题排查.踩坑实践. 协议 协议通俗易懂地解释就是通信双方需要遵循的约定. 我们了解的常见的网络传输协议 ...
- Dubbo(五):Dubbo中的URL统一资源模型与Dubbo协议
一.URL简介 URL也就是Uniform Resource Locator,中文叫统一资源定位符.Dubbo中无论是服务消费方,或者服务提供方,或者注册中心.都是通过URL进行定位资源的.所以今天来 ...
- dubbo源码分析4-基于netty的dubbo协议的server
dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...
- Dubbo协议与连接控制
协议参考手册 (+) (#) 推荐使用Dubbo协议 性能测试报告各协议的性能情况,请参见:性能测试报告 (+) dubbo:// (+) (#) Dubbo缺省协议采用单一长连接和NIO异步通讯,适 ...
- Dubbo协议
参考dubbo官方文档http://dubbo.apache.org/zh-cn/docs/user/references/protocol/dubbo.html dubbo共支持如下几种通信协议: ...
- dubbo协议下的单一长连接与多线程并发如何协同工作
上班的路上突然就冒出了这么个问题:既然在dubbo中描述消费者和提供者之间采用的是单一长连接,那么如果消费者端是高并发多线程模型的web应用,单一长连接如何解决多线程并发请求问题呢? 其实如果不太了解 ...
- dubbo hessian+dubbo协议
Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况 Hessian协议用于集成Hessian的服务,Hessian底层采 ...
- 聊聊Http协议
http协议是大家在互联网中最为熟悉的协议,只要上网大家都会遇到,但是,很多人被问道什么是http协议,http协议的内容是什么就懵了.这里,我们随便聊聊http协议. 首先,我们说说协议.我一直觉得 ...
- dubbo协议参考手册(转)
原文链接:http://wely.iteye.com/blog/2331332 协议参考手册 (+) (#) 推荐使用Dubbo协议 性能测试报告各协议的性能情况,请参见:性能测试报告 (+) dub ...
随机推荐
- CF935B Fafa and the Gates 题解
Content 一个动点 \(F\) 一开始在平面直角坐标系上原点的位置,随后它会移动 \(n\) 次,每次只能向上走或者向右走 \(1\) 个单位,求经过直线 \(y=x\) 的次数. 数据范围:\ ...
- uniapp+nvue实现仿微信/得物相册插件:选择界面 +自定义相册+图片视频过滤
本篇文章基于uniapp 框架+ nvue,实现了uniapp仿微信/得物相册选择功能实例项目,该插件实例实现了以下功能: 1: 相册过滤 2: 图视频过滤 3: 界面UI定制化 4: 栅格列数定制化 ...
- TensorFlow.NET机器学习入门【3】采用神经网络实现非线性回归
上一篇文章我们介绍的线性模型的求解,但有很多模型是非线性的,比如: 这里表示有两个输入,一个输出. 现在我们已经不能采用y=ax+b的形式去定义一个函数了,我们只能知道输入变量的数量,但不知道某个变量 ...
- Spring核心原理之IoC容器初体验(2)
本文节选自<Spring 5核心原理> 1 IoC与DI基本概念 IoC(Inversion of Control,控制反转)就是把原来代码里需要实现的对象创建.依赖,反转给容器来帮忙实现 ...
- nim_duilib(12)之menu(2)
introduction 更多控件用法,请参考 here 和 源码. 本文将介绍menu的选项注册回调 before starting 本文的代码基于上一篇 stage1 回到项目demo_xml, ...
- 【LeetCode】628. Maximum Product of Three Numbers 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 方法一:排序 日期 题目地址:https://lee ...
- 【LeetCode】165. Compare Version Numbers 解题报告(Python)
[LeetCode]165. Compare Version Numbers 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博 ...
- 1122 机器人走方格 V4
1122 机器人走方格 V4 基准时间限制:1 秒 空间限制:131072 KB 四个机器人a b c d,在2 * 2的方格里,一开始四个机器人分别站在4个格子上,每一步机器人可以往临近的一个格子 ...
- Codeforces 931C:Laboratory Work(构造)
C. Laboratory Work time limit per test : 1 second memory limit per test : 256 megabytes input : stan ...
- Geometric GAN
目录 概 主要内容 McGAN 结合SVM 训练 训练 理论分析 证明 Jae Hyun Lim, Jong Chul Ye, Geometric GAN. 概 很有趣, GAN的训练过程可以分成 寻 ...