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
英文地址,請注明出處:http://en.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…