本文已收录 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.02.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&timestamp=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的更多相关文章

  1. 聊聊dubbo协议

    搜索关注微信公众号"捉虫大师",后端技术分享,架构设计.性能优化.源码阅读.问题排查.踩坑实践. 协议 协议通俗易懂地解释就是通信双方需要遵循的约定. 我们了解的常见的网络传输协议 ...

  2. Dubbo(五):Dubbo中的URL统一资源模型与Dubbo协议

    一.URL简介 URL也就是Uniform Resource Locator,中文叫统一资源定位符.Dubbo中无论是服务消费方,或者服务提供方,或者注册中心.都是通过URL进行定位资源的.所以今天来 ...

  3. dubbo源码分析4-基于netty的dubbo协议的server

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...

  4. Dubbo协议与连接控制

    协议参考手册 (+) (#) 推荐使用Dubbo协议 性能测试报告各协议的性能情况,请参见:性能测试报告 (+) dubbo:// (+) (#) Dubbo缺省协议采用单一长连接和NIO异步通讯,适 ...

  5. Dubbo协议

    参考dubbo官方文档http://dubbo.apache.org/zh-cn/docs/user/references/protocol/dubbo.html dubbo共支持如下几种通信协议: ...

  6. dubbo协议下的单一长连接与多线程并发如何协同工作

    上班的路上突然就冒出了这么个问题:既然在dubbo中描述消费者和提供者之间采用的是单一长连接,那么如果消费者端是高并发多线程模型的web应用,单一长连接如何解决多线程并发请求问题呢? 其实如果不太了解 ...

  7. dubbo hessian+dubbo协议

    Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况 Hessian协议用于集成Hessian的服务,Hessian底层采 ...

  8. 聊聊Http协议

    http协议是大家在互联网中最为熟悉的协议,只要上网大家都会遇到,但是,很多人被问道什么是http协议,http协议的内容是什么就懵了.这里,我们随便聊聊http协议. 首先,我们说说协议.我一直觉得 ...

  9. dubbo协议参考手册(转)

    原文链接:http://wely.iteye.com/blog/2331332 协议参考手册 (+) (#) 推荐使用Dubbo协议 性能测试报告各协议的性能情况,请参见:性能测试报告 (+) dub ...

随机推荐

  1. 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 ...

  2. Birt报表分组格式调整

    1.以如下SQL语句来说明,查找未完成打分的人员,有cname(测评人名字),uname(测评人单位),bname(被测评人名字),flag字段(未完成标志) SELECT var.cname,var ...

  3. libevent源码学习(8):event_signal_map解析

    目录event_signal_map结构体向event_signal_map中添加event激活event_signal_map中的event删除event_signal_map中的event以下源码 ...

  4. JAVA验证手机号码是否正确

    PhoneUtils.java package com.common.util; import java.util.regex.Matcher; import java.util.regex.Patt ...

  5. JAVAWEB统一返回格式Result类

    Result.java public class Result<T> { private Integer code; private String msg; private String ...

  6. ByteBuddy代码生成技术

    简介 如官网所说Byte Buddy 是一个代码生成和操作库,用于在Java应用程序运行时创建和修改Java类,而无需编译器的帮助.除了Java类库附带的代码生成实用程序外,Byte Buddy还允许 ...

  7. 【LeetCode】469. Convex Polygon 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 计算向量夹角 日期 题目地址:https://leet ...

  8. 【九度OJ】题目1171:C翻转 解题报告

    [九度OJ]题目1171:C翻转 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1171 题目描述: 首先输入一个5 * 5的数组,然 ...

  9. 【LeetCode】504. Base 7 解题报告(Java & Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 内建库 BigInteger类 逐位计算 倍数相加 ...

  10. Codeforces 855B:Marvolo Gaunt's Ring(枚举,前后缀)

    B. Marvolo Gaunt's Ring Professor Dumbledore is helping Harry destroy the Horcruxes. He went to Gaun ...