聊聊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.2
2.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 ...
随机推荐
- CSAPP 并发编程读书笔记
CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...
- C++ 11 新特性:函数声明auto
1.概览 1.1 函数名中的箭头,用来表明函数的return type,其使用在函数的返回类型需要通过模板参数进行推导,使用在decltype()和declval()不方便的场景 2.正文 c++ 中 ...
- [WPF] 实现 WPF 的 Inner Shadow
在 WPF 中,我们通常用 DropShadow 做阴影效果,但都是做外阴影.内阴影(Inner Shadow)的话其实也不是不可以,就是有些曲折.这篇文章介绍几种做内引用的做法. 文章涉及到以下概念 ...
- nim_duilib(12)之menu(2)
introduction 更多控件用法,请参考 here 和 源码. 本文将介绍menu的选项注册回调 before starting 本文的代码基于上一篇 stage1 回到项目demo_xml, ...
- 【九度OJ】题目1441:人见人爱 A ^ B 解题报告
[九度OJ]题目1441:人见人爱 A ^ B 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1441 题目描述: 求A^B ...
- 【LeetCode】76. Minimum Window Substring 最小覆盖子串(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 滑动窗口 日期 题目地址: https://leet ...
- C. Unfair Poll
http://codeforces.com/problemset/problem/758/C C. Unfair Poll time limit per test 1 second memory li ...
- (原创)WinForm中莫名其妙的小BUG——RichTextBox自动选择字词问题
一.前言 使用WinForm很久了,多多少少会遇到一些小BUG. 这些小BUG影响并不严重,而且稍微设置一下就能正常使用,而且微软一直也没有修复这些小BUG. 写本系列文章,是为了记录一下这些无伤大雅 ...
- Mind the Box: $\ell_1$-APGD for Sparse Adversarial Attacks on Image Classifiers
目录 概 主要内容 Croce F. and Hein M. Mind the box: \(\ell_1\)-APGD for sparse adversarial attacks on image ...
- pycharm遇到的小问题
1. Pycharm编写的代码出现满屏的波浪线,如何去除>>>点击右下角的小人图标将箭头移到中间syntax处即可. 2. 运行时报错: UserWarning: No parser ...