聊聊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 ...
随机推荐
- CentOS7.6 鲜为人知的/etc/resolv.conf 之 /etc/resolv.conf.save (保持/etc/resolv.conf不被修改:/etc/dhcp/dhclient-enter-hooks 无效之/etc/resolv.conf被清空的特殊案例)
目的: 用户可以自定义/etc/resolv.conf内容,且不被系统修改. 常规方法1: /etc/sysconfig/network-scripts/ifcfg-eth0 网卡配置文件中增加PEE ...
- Birt报表分组格式调整
1.以如下SQL语句来说明,查找未完成打分的人员,有cname(测评人名字),uname(测评人单位),bname(被测评人名字),flag字段(未完成标志) SELECT var.cname,var ...
- libevent源码学习(8):event_signal_map解析
目录event_signal_map结构体向event_signal_map中添加event激活event_signal_map中的event删除event_signal_map中的event以下源码 ...
- JAVA验证手机号码是否正确
PhoneUtils.java package com.common.util; import java.util.regex.Matcher; import java.util.regex.Patt ...
- JAVAWEB统一返回格式Result类
Result.java public class Result<T> { private Integer code; private String msg; private String ...
- ByteBuddy代码生成技术
简介 如官网所说Byte Buddy 是一个代码生成和操作库,用于在Java应用程序运行时创建和修改Java类,而无需编译器的帮助.除了Java类库附带的代码生成实用程序外,Byte Buddy还允许 ...
- 【LeetCode】469. Convex Polygon 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 计算向量夹角 日期 题目地址:https://leet ...
- 【九度OJ】题目1171:C翻转 解题报告
[九度OJ]题目1171:C翻转 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1171 题目描述: 首先输入一个5 * 5的数组,然 ...
- 【LeetCode】504. Base 7 解题报告(Java & Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 内建库 BigInteger类 逐位计算 倍数相加 ...
- Codeforces 855B:Marvolo Gaunt's Ring(枚举,前后缀)
B. Marvolo Gaunt's Ring Professor Dumbledore is helping Harry destroy the Horcruxes. He went to Gaun ...