dubbo源码学习2-dubbo协议源码分析

协议(Protocol)的概念
协议(Protocol)是指在计算机通信或网络交互中,双方事先约定好的规则和标准,用于规范数据如何打包、传输、接收和解释。

所以简单说就是规则,发送数据编码的规则,接收数据解码的规则

Dubbo中的协议
在Dubbo框架中,协议特指RPC(远程过程调用)的通信协议,主要包括:

Dubbo协议:Dubbo默认的自定义二进制协议,基于TCP长连接,二进制头部+序列化体,支持请求-响应模式

dubbo 协议数据包格式
dubbo协议的一个完整的数据包分为消息头和消息体
消息头的长度是 16 字节,在消息头中分为5段内容
magic:占用2个字节,第一个字节值默认是 -38,第二个字节值默认是 -69
flag: 占用一个字节,位于消息头第三位
status: 占用一个字节,位于消息头第4为
request id: 占用8个字节,位于消息头第5-11位,请求Id是一个 long 类型
data length: 占用4个字节,位于消息头最后4为,长度是一个int类型
在这里插入图片描述
以如下消息头为例,flag 是需要转为 8 位的二进制数据进行解析的
status 位值为0,是因为这是一个请求报文,status 仅在响应时有效,表示响应状态,20-OK,30-CLIENT_TIMEOUT,31-SERVER_TIMEOUT等
在这里插入图片描述
关于 flag 的分析

  • 第0位:表示请求/响应标志(1-请求,0-响应)
  • 第1位:是否为双向通信(1-是,0-否)
  • 第2位:是否为事件消息(如心跳事件)
  • 第3-7位:序列化类型编号

消息头分析完了,接下来我们根据源码来分析
dubbo是基于Netty通信的,在dubbo服务启动时,会初始化Netty的线程模型,设置了编解码器类型
InternalDecoder ( 解码器 ) 接收数据时用到
InternalEncoder ( 编码器 ) 发送数据时用到
NettyServerHandler Netty消息处理器
在这里插入图片描述
在接收到数据进行解码时,会通过

int saveReaderIndex = message.readerIndex();

记录当前读取位置,如果读取到的 msg 是Codec2.DecodeResult.NEED_MORE_INPUT 时,表示需要更多数据,则会通过重置读取数据的位置,防止出现半包问题

message.readerIndex(saveReaderIndex);

在这里插入图片描述
在 ExchangeCodec 中定义了消息头的长度为16,并且读取了消息头到 byte[] 中
在这里插入图片描述
在 ExchangeCodec 中还会执行以下步骤

  • 检查magic值,检查高位是否等于 -38,低位是否等于 -69,在dubbo中,这两个值是固定的
  • 如果可读数据长度小于16,则返回需要更多数据
  • 从消息头中,从12位开始读取一个int 值为消息体长度,一个int 为4字节,刚好是消息头的最后4位
  • 如果可读数据小于消息体长度加消息头长度,则返回需要更多数据

在 dubbo中从消息头读取消息长度,再读取对应长度的消息体是解决TCP 粘包问题的关键所在

在这里插入图片描述
读取消息头的第2位,为 flag,在这里 flag 多处做位运算

  • 从 flag 计算出协议类型 proto
  • 计算消息类型是 请求类型还是响应类型
  • 如果是响应类型,判断是否是Response.OK
  • 如果是请求类型,判断是否是双向包
  • 从 proto 中可知是心跳类型还是普通消息类型
    在这里插入图片描述
    如果是请求类型时,使用 DecodeableRpcInvocation 解码实际的消息体
    如果是响应类型时,使用 DecodeableRpcResult 解码实际的消息体
    在这里插入图片描述
    在消息的编解码处理完成之后,解码后的消息体会交给 NettyServerHandler 进行处理,NettyServerHandler则是dubbo接入服务的范围了

执行流程可以参考

dubbo源码学习1-服务提供方接入执行源码分析

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90080.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

麒麟信安联合申威:共筑安全高效的自主计算新生态

为深化长三角区域先进技术产业协同创新,推动集成电路领域技术需求对接,6月26日“集成电路领域产业技术需求对接一申威生态成果分享”专题活动举行。本次活动聚焦国产化全栈能力建设,重点发布申威产品与生态的最新进展,促成“芯片-…

裸仓库 + Git Bash 搭建 本地 Git 服务端与客户端

下面是在 Windows 上使用 裸仓库 Git Bash 搭建 本地 Git 服务端与客户端 的详细步骤。适合本机或局域网其他设备通过 SSH 或本地路径 访问,简单轻量,适合开发者日常使用或小团队协作。 🛠️ 一、准备工作 1. 安装 Git for Windows 默认安装…

AI文档智能体上线!AutoHub v0.7.0 全面升级,重构知识工作流

AI文档智能体上线!AutoHub v0.7.0 全面升级,重构知识工作流 如何让每一个知识工作者都像专家一样高效? 这正是 OpenCSG AutoHub 想解决的问题。 无论你是产品经理、项目负责人、运维工程师,还是企业管理者,日常都要…

SpringMVC参数接收与数据返回详解

一,参数的接收参数接收的几种方式:1.使用servlet API接收参数在方法参数中添加HttpServletRequest类型的参数,然后就可以像servlet的方法一样来接收参数 RequestMapping("p1")public String param1(HttpServletRequest request){St…

OpenCV 人脸分析----人脸识别的一个经典类cv::face::EigenFaceRecognizer

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 这是基于 PCA(主成分分析) 的人脸识别算法实现。它通过将人脸图像投影到一个低维的“特征脸”空间中进行识别&#xff0c…

RESTful风格

带着问题,找答案: 通过本片文章,你会了解以下四点。并且我会给出go语言的实现案例。 1、了解restful风格的来源、起源、演变史 2、了解restful风格的定义、含义 3、掌握restful风格的简单运用 4、做一个小demo 在restful中前进&#xf…

了解GC吗?什么是GC?

GC是什么?为什么要GC? GC( Garbage Collection ),垃圾回收,是Java与C的主要区别之一。作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码。这是因为在Java虚拟机中,存在自动…

FDMA读写AXI BRAM交互:FPGA高速数据传输的核心技术

在图像处理系统中,当1080P视频流以每秒60帧的速度传输时,传统DMA每帧会浪费27%的带宽在地址管理上——而FDMA技术能将这些损失降至3%以内 现代FPGA系统中,高效数据搬运往往是性能瓶颈的关键所在。当你在手机上流畅播放4K视频、在自动驾驶系统中实时处理激光雷达点云时,背后…

独立开发A/B测试实用教程

A/B测试(A/B Testing),又称分组测试、对照实验,是产品开发和运营中提升转化率、优化用户体验的常用方法。无论你是做App、SaaS、网站还是小程序,合理地利用A/B测试,都能帮助你用数据驱动决策,让…

如何将iPhone备份到Mac/MacBook

许多iPhone用户非常重视备份,但在Mac上选择合适的备份方法可能会令人困惑。市场上有各种各样的备份工具,找到一个既易于使用又能保存所有重要数据(如照片、视频、消息、WhatsApp聊天记录和联系人)的工具至关重要。如果你正在寻找一…

Logseq 插件开发实战四:发布到官方插件市场

🚩系列回顾 初识插件机制并实现自动压缩粘贴的图片国际化 I18N 与配置多语言自定义斜线命令 SlashCommand发布到官方插件市场 开源地址:logseq-plugin-image-tiny,欢迎来⭐。 🐞 插件上线问题记录 问题描述 本地插件开发完成后…

[netty5: ByteToMessageCodec MessageToByteEncoder ByteToMessageDecoder]-源码分析

ByteToMessageCodec ByteToMessageCodec 是一个结合了 ByteToMessageDecoder 和 MessageToByteEncoder 的编解码器&#xff0c;可以实时地将字节流编码或解码为消息&#xff0c;反之亦然。 public abstract class ByteToMessageCodec<I> extends ChannelHandlerAdapter {…

Ubuntu20.04安装mujoco210, mujoco-py时的报错处理

参考 Ubantu 20.04 安装 Mujoco210、mujoco-py、gym及报错解决 安装 mujoco210 创建 .mujoco 文件夹 mkdir ~/.mujoco亲测必须是 .mujoco 文件夹&#xff0c;不然会报错&#xff01; 下载 mujoco210-linux-x86_64.tar.gz 并解压到 .mujoco 文件夹 mojoco下载地址 测试 mojo…

全志T507 音频ALSA核心层注册流程分析

一.ALSA核心层注册流程分析 驱动目录&#xff1a;kernel-4.9/sound/core/sound.c struct file_operations snd_fops {.owner THIS_MODULE,.open snd_open, (inode, file)---->struct snd_minor *mptr snd_minors[minor];---->file->f_op fops_get(mptr->f_ops…

评论区实现 前端Vue

根据后端部分定义评论区功能实现 golang后端部分-CSDN博客&#xff0c;重点需要实现三个部分&#xff0c;1.当前用户发起新根评论请求&#xff1b;2.评论区展示部分&#xff1b;3.某一根评论的子评论展示以及回复组件显示。 整体流程解释 数据从后端接收&#xff0c;整体在in…

差分定位技术:原理、分类与应用场景

文章目录 简介基本概念位置差分伪距差分载波相位 差分定位技术精密单点定位&#xff08;PPP&#xff09;差分全球定位系统&#xff08;DGPS&#xff09;实时动态定位&#xff08;RTK&#xff09; 应用场景总结 简介 差分定位&#xff08;Differential Positioning&#xff09;是…

tomcat的tar包转换成rpm包的保姆级教程

环境说明 &#xff1a;centos 71. 安装打包工具&#xff1a;yum install -y rpm-build rpmdevtools2. 创建 RPM 打包环境&#xff1a;rpmdev-setuptree​输入之后是下面的结果~/rpmbuild/ ├── BUILD ├── RPMS ├── SOURCES ├── SPECS └── SRPMS​准备 Tomcat 源码…

【牛客算法】小美的数组删除

文章目录 一、题目介绍二、解题思路三、解题算法实现四、算法分析4.1 代码逻辑4.2 逆向遍历求MEX的设计精妙之处4.2.1 逆向遍历:解决MEX更新的连续性4.2.2 利用MEX的单调性4.2.3 空间复用与状态压缩4.2.4 与问题特性的完美契合4.2.5 总结:为什么说这个设计“妙”?五、算法复…

MyBatisPlus-01-环境初始化及简单应用

文章目录【README】【1】springboot集成mybatis-plus配置【1.1】目录结构【相关说明】【1.2】代码示例【pom.xml】【application.properties】【MybatisPlusNoteController】【UserAppService】【UserMapper】【UserPO】【建表语句】【2】演示【README】 本文代码参见&#xf…

Web爬虫编程语言选择指南

刚学爬虫的小伙伴常常为选择那种语言来写爬虫而烦恼&#xff0c;今天我将总结几种语言的优劣势&#xff0c;然后选择适合编写 Web爬虫 的编程语言。这就需要我们考虑开发效率、生态库支持、并发性能等因素。以下是主流选择及特点跟着一起看看吧&#xff1a; 1. Python&#xff…