Dubbo 源码剖析与实战
何辉
平安壹钱包架构师
4711 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 33 讲
开篇词 (1讲)
Dubbo 源码剖析与实战
15
15
1.0x
00:00/00:00
登录|注册

22|协议编解码:接口调用的数据是如何发到网络中的?

你好,我是何辉。今天我们深入研究 Dubbo 源码的最后一篇,协议编解码。
你已经学过了 Dubbo 框架的十大模块(01 讲),上一讲也掌握消费方调用的整体框架流程,基本把 Dubbo 框架纵向走了一遍,但依然在单进程中转悠。而 Dubbo 的本质就是网络通信,要想把数据发到网络送往提供方,默认用 Netty 网络通信框架完成的。
那发起接口调用时,你创建出来的一个普普通通的请求对象,到底是如何被编解码后发到网络中的呢?如果你平常不怎么接触底层,这个问题想回答好确实有点难。不过不用担心,我们也研究了不少源码,按套路,根据一些蛛丝马迹顺着研究,解答这个问题其实就是一层窗户纸的事。

什么是帧格式?

想回答清楚今天的问题,我们从一个概念开始,帧格式。
所谓的“帧格式”,就是指根据不同协议规定的数据传输的格式。举个常见的 TCP/IP 模型,分别有应用层、传输层、网络层、数据链路层,以及物理层,每一层都有着对应的数据帧格式。
我们以数据封装的过程为例。
比如,应用层的数据包 +TCP 头部就是传输层的帧格式,传输层的数据包 +IP 头部就是网络层的帧格式,网络层的数据包 +MAC 头部就是数据链路层的帧格式,最后,会把数据链路层的整个数据包,变成比特流,通过工作在物理层的网卡、网线或光纤发送出去。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了Dubbo框架的协议编解码机制,重点介绍了数据传输格式的重要性以及客户端与服务器之间的约定传输数据方式。通过对Dubbo框架源码的分析,详细解读了encodeRequest方法的实现方式,展示了Dubbo协议帧格式的构成,包括魔术高位、魔术低位、请求类型和序列化方式等内容。此外,文章还提到了其他常见的协议编解码的应用案例,如HTTP协议、RESP协议、WebSocket协议等,为读者提供了更多的参考和思考。最后,留下了一个思考题,引导读者深入研究Dubbo框架的encodeResponse方法的逻辑,以及消费方进行泛化调用时的流程和底层实现。通过本文的总结,读者可以快速了解Dubbo框架中数据传输的细节,以及协议帧格式的构成方式,同时也引发了对其他协议编解码应用案例的思考和探索。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Dubbo 源码剖析与实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(3)

  • 最新
  • 精选
  • 张三丰
    老师,这里我有个疑问,在定长+变长这个协议格式传输的时候,如果服务端第一次接收的不完整,比如120字节的消息,第一次接收100字节,第二次接收20字节,对于服务端来说,如果第二次接收20字节的时候,这个20字节的消息会像100字节的消息那样包括请求头吗? 比如请求头+100字节请求体、请求头+20字节请求体,如果包括请求头,那么第一次处理消息和第二次处理消息在逻辑上有什么不同?第一次处理消息时肯定是先解析请求头再解析请求体,第二次也是这样解析吗?服务端怎么确认第二次收到的消息是第一次消息的接续?

    作者回复: 你好,张三丰: 1、这个20字节的消息会像100字节的消息那样包括请求头吗? 答:不会。 2、第一次处理消息时肯定是先解析请求头再解析请求体,第二次也是这样解析吗? 答:第二次直接 read 后面的 20 字节的。 3、服务端怎么确认第二次收到的消息是第一次消息的接续? 答:简单点理解服务端也是一次连接的读取,端到端的Socket连接读取,读取的时候就可以计数直到读取到整个包。短链接socket包读完即可,长连接计数读数据包。

    2023-03-20归属地:北京
  • Lum
    希望老师出一章消费端发送请求后,服务端是如何接收消息并返回的章节~

    作者回复: 你好,Lum:服务端接收并返回,路子其实是一样的,NettySever 里面可以设置好断点收数据,收到数据后会调用服务端自身的Dubbo接口,接口返回数据后一路断点下去,最终还是会调用 Netty 的类 write 出去,而write 出去势必会进行编码处理,你可以试着按照我刚说的几个节点,带着条件断点看看,也许你很快就明白了~

    2023-03-06归属地:北京
    2
  • BraveSky
    老师你好,请教个dubbo序列化问题,目前线上服务用的kryo 序列化,kryo序列化对象dto 加字段,调用方反序列化就会报错,重新部署服务才行,这个有什么好的解决方案吗?如果换序列化方式的话,如何不影响现有服务情况下,平滑切换?

    作者回复: 你好,BraveSky:不好意思,你问的这个问题,我并没有在生产上切实使用过 kryo 进行序列化处理。

    2023-02-14归属地:上海
收起评论
显示
设置
留言
3
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部