# KVstorageBaseRaft-cpp 項目 RPC 模塊源碼學習

KVstorageBaseRaft-cpp 項目 RPC 模塊源碼學習

一、項目簡介

KVstorageBaseRaft-cpp 是一個基于 Raft 一致性算法實現的分布式 KV 存儲系統,采用 C++ 開發。項目的核心目標是幫助開發者理解 Raft 原理和分布式 KV 存儲的基本實現。RPC 模塊是分布式系統通信的關鍵基礎設施,負責節點間、客戶端與服務端之間的遠程過程調用。

二、RPC 模塊結構總覽

源碼主要位于 src/rpc/ 目錄,包含如下關鍵文件:

  • mprpcchannel.h/cpp:RPC 客戶端通道,負責序列化、發送請求、接收響應。
  • mprpccontroller.h/cpp:RPC 調用控制器,負責錯誤狀態管理。
  • mprpcconfig.h/cpp:RPC 配置加載,負責讀取 ip、端口等配置信息。
  • rpcprovider.h/cpp:RPC 服務端,負責服務注冊、請求分發和實際業務調用。
  • rpcheader.proto:RPC 協議頭部的 protobuf 定義。
  • rpcheader.pb.h/cpp:由 proto 自動生成的協議頭部 C++ 代碼。

三、核心源碼解讀

1. RPC 協議頭部定義

rpcheader.proto 內容如下:

syntax = "proto3";
package RPC;message RpcHeader {bytes service_name = 1;bytes method_name = 2;uint32 args_size = 3;
}
  • 該消息定義了每次 RPC 調用的服務名、方法名和參數長度,便于服務端正確分發請求。

2. RPC 客戶端通道(mprpcchannel)

主要職責
  • 負責將本地的 RPC 方法調用序列化為網絡數據包,發送到遠程服務端,并接收響應。
  • 自動處理連接失敗時的重連與重試。
關鍵流程
  1. 獲取服務名和方法名
    通過 MethodDescriptor 自動獲取,便于通用化。
  2. 參數序列化
    將請求參數序列化為字符串,記錄長度。
  3. 構造并序列化 RpcHeader
    組裝服務名、方法名、參數長度,序列化為二進制。
  4. 數據打包
    先寫入 header 長度(變長編碼),再寫入 header 內容,最后拼接參數內容。
  5. 發送與重連
    發送失敗自動重連,保證健壯性。
  6. 接收與反序列化響應
    ParseFromArray 反序列化,避免字符串截斷 bug。
代碼片段舉例
// 1. 獲取服務名和方法名
const google::protobuf::ServiceDescriptor* sd = method->service();
std::string service_name = sd->name();
std::string method_name = method->name();// 2. 參數序列化
uint32_t args_size{};
std::string args_str;
if (request->SerializeToString(&args_str)) {args_size = args_str.size();
} else {controller->SetFailed("serialize request error!");return;
}// 3. 構造 RpcHeader
RPC::RpcHeader rpcHeader;
rpcHeader.set_service_name(service_name);
rpcHeader.set_method_name(method_name);
rpcHeader.set_args_size(args_size);// 4. 數據打包
std::string send_rpc_str;
{google::protobuf::io::StringOutputStream string_output(&send_rpc_str);google::protobuf::io::CodedOutputStream coded_output(&string_output);coded_output.WriteVarint32(static_cast<uint32_t>(rpc_header_str.size()));coded_output.WriteString(rpc_header_str);
}
send_rpc_str += args_str;// 5. 發送與重連
while (-1 == send(m_clientFd, send_rpc_str.c_str(), send_rpc_str.size(), 0)) {// ...重連邏輯...
}// 6. 接收與反序列化
if (!response->ParseFromArray(recv_buf, recv_size)) {controller->SetFailed("parse error!");return;
}

3. RPC 控制器(mprpccontroller)

  • 負責記錄本次 RPC 調用的失敗狀態和錯誤信息,便于上層業務判斷和處理。
  • 代碼簡潔,主要實現了 SetFailedFailedErrorText 等接口。

4. RPC 服務端(rpcprovider)

  • 負責服務注冊、請求分發和實際業務調用。
  • 建議結合頭文件和實現文件一起閱讀,理解服務端如何根據收到的 RpcHeader 分發到具體的服務和方法。

5. 配置加載(mprpcconfig)

  • 負責從配置文件讀取 ip、端口等信息,便于靈活部署和管理。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/79393.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/79393.shtml
英文地址,請注明出處:http://en.pswp.cn/web/79393.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

TeledyneLeCroy在OFC2025 EA展臺上展示了其400G/800G的全包圍的測試解決方案,滿足了UEC聯盟和UALINK聯盟的技術需求

Teledyne LeCroy在OFC 2025上的EA展臺 在2025年3月26日至28日于美國圣地亞哥舉辦的OFC&#xff08;Optical Fiber Communication Conference and Exhibition&#xff09;展會上&#xff0c;全球領先的測試測量解決方案提供商Teledyne LeCroy隆重展示了其最新研發的800G網絡測試…

新一代電動門“攻克”行業痛點,遠峰科技打造“智能出入”新標桿

在2025上海國際車展期間&#xff0c;遠峰科技舉辦了一場面向車企合作伙伴和媒體的智能汽車解決方案實車展示會。 在這其中&#xff0c;遠峰科技的新一代電動門首次亮相&#xff0c;突破性的解決了行業普遍存在的“運行抖動不平順”、“窄車位車門開度過小”、“障礙物識別不準…

WEB UI自動化測試之Pytest框架學習

文章目錄 前言Pytest簡介Pytest安裝Pytest的常用插件Pytest的命名約束Pytest的運行方式Pytest運行方式與unittest對比主函數運行命令行運行執行結果代碼說明 pytest.ini配置文件方式運行&#xff08;推薦&#xff09;使用markers標記測試用例 pytest中添加Fixture&#xff08;測…

機器學習簡單概述

Chatgpt回答&#xff1a; 機器學習&#xff1a;機器學習是人工智能的一個分支&#xff0c;側重于通過數據訓練模型&#xff0c;使計算機能夠根據數據進行預測、分類、回歸等任務。它通過算法從歷史數據中學習規律&#xff0c;然后在新數據上進行推斷。機器學習包括多種算法&…

openjdk底層匯編指令調用(一)——匯編指令及指令編碼基礎

匯編指令 計算機在執行過程時只識別代表0或者1的電信號。因此為了讓計算機能夠執行則須向計算機輸入一系列01構成的指令。 例如在x64平臺下&#xff0c;0x53&#xff0c;二進制為01010011&#xff0c;表示將rbx寄存器中的值壓棧。 但是&#xff0c;對于程序員而言&#xff0c;…

Python Day 22 學習

學習講義Day14安排的內容&#xff1a;SHAP圖的繪制 SHAP模型的基本概念 參考學習的帖子&#xff1a;SHAP 可視化解釋機器學習模型簡介_shap圖-CSDN博客 以下為學習該篇帖子的理解記錄&#xff1a; Q. 什么是SHAP模型&#xff1f;它與機器學習模型的區別在哪兒&#xff1f; …

48.輻射發射RE和傳導發射CE測試方法分析

輻射發射RE和傳導發射CE測試方法分析 1. 所有測試項目總結2. 輻射發射RE測試方法3. 傳到發射CE測試方法 1. 所有測試項目總結 所有EMC測試項目都是基于模擬現實的。 模擬現實中可能發生的各種真實場景&#xff0c;然后統計總結出各種場景下的真實應力&#xff0c;并通過制造測…

在 Vue 3 中實現刮刮樂抽獎

&#x1f389; 在 Vue 3 中實現刮刮樂抽獎 當項目中需要做一些活動互動頁時&#xff0c;需要實現刮刮樂&#xff0c;請看如下效果&#xff1a; 這里感謝github用戶Choicc分享的組件&#xff0c;具體可點擊傳送門查看 1. 引入組件 將/src/components下ScratchCard.vue復制到自…

c語言第一個小游戲:貪吃蛇小游戲01

hello啊大家好 今天我們用一個小游戲來增強我們的c語言&#xff01; 那就是貪吃蛇 為什么要做一個貪吃蛇小游戲呢&#xff1f; 因為這個小游戲所涉及到的知識有c語言的指針、數組、鏈表、函數等等可以讓我們通過這個游戲來鞏固c語言&#xff0c;進一步認識c語言。 一.我們先…

實戰項目1(02)

目錄 任務場景一 【sw1和sw2的配置如下】 任務場景二 【sw3的配置】 【sw4-6的配置】 任務場景一 某公司有生產、銷售、研發、人事、財務等多個部門&#xff0c;這些部門分別連接在兩臺交換機&#xff08;SW1和SW2&#xff09;上&#xff0c;現要求給每個部門劃分相應的V…

Kubernetes生產實戰(十四):Secret高級使用模式與安全實踐指南

一、Secret核心類型解析 類型使用場景自動管理機制典型字段Opaque (默認)自定義敏感數據需手動創建data字段存儲鍵值對kubernetes.io/dockerconfigjson私有鏡像倉庫認證kubelet自動更新.dockerconfigjsonkubernetes.io/tlsTLS證書管理Cert-Manager可自動化tls.crt/tls.keykube…

Linux: 信號【阻塞和捕捉信號】

Linux&#xff1a; 信號【阻塞和捕捉信號】 &#xff08;一&#xff09;阻塞信號1.信號其他相關的概念2.在內核中表示3.sigset_t4.信號集操作函數5.sigprocmask&#xff08;設置阻塞&#xff09;6.sigpending&#xff08;得到未決狀態&#xff09; &#xff08;二&#xff09;捕…

MySQL 數據庫集群部署、性能優化及高可用架構設計

MySQL 數據庫集群部署、性能優化及高可用架構設計 集群部署方案 1. 主從復制架構 傳統主從復制&#xff1a;配置一個主庫(Master)和多個從庫(Slave)GTID復制&#xff1a;基于全局事務標識符的復制&#xff0c;簡化故障轉移半同步復制&#xff1a;確保至少一個從庫接收到數據…

Java 多態:原理與實例深度剖析

一、多態概述 在 Java 面向對象編程體系中&#xff0c;多態是構建靈活、可擴展程序的核心機制之一&#xff0c;與封裝、繼承并稱為面向對象的三大特性。其本質是同一操作作用于不同對象&#xff0c;產生不同的執行結果&#xff0c;這使得程序在運行時能根據實際對象類型動態調…

解決使用寶塔Linux部署前后端分離項目遇到的問題

問題一&#xff1a;訪問域名轉圈圈&#xff0c;顯示404,403 沒有解決跨域問題&#xff0c;在后端yml中設置content&#xff1a;/prod&#xff08;生產環境&#xff09;&#xff0c;在前端.env文件中將http&#xff1a;//127.0.0.1:8080/替換為公網IP&#xff0c;并在vite.conf…

《Python星球日記》 第54天:卷積神經網絡進階

名人說&#xff1a;路漫漫其修遠兮&#xff0c;吾將上下而求索。—— 屈原《離騷》 創作者&#xff1a;Code_流蘇(CSDN)&#xff08;一個喜歡古詩詞和編程的Coder&#x1f60a;&#xff09; 目錄 一、深度CNN架構解析1. LeNet-5&#xff08;1998&#xff09;2. AlexNet&#x…

旅游設備生產企業的痛點 質檢系統在旅游設備生產企業的應用

在旅游設備制造行業&#xff0c;產品質量直接關系到用戶體驗與企業口碑。從景區纜車、觀光車到水上娛樂設施&#xff0c;每一件設備的安全性與可靠性都需經過嚴苛檢測。然而&#xff0c;傳統質檢模式常面臨數據分散、流程不透明、合規風險高等痛點&#xff0c;難以滿足旅游設備…

MySql(進階)

一.數據庫約束 約束類型 NOT NULL - 指示某列不能存儲 NULL 值。 (not null不能為NILL) UNIQUE - 保證某列的每行必須有唯一的值。 &#xff08;unique唯一值&#xff09; DEFAULT - 規定沒有給列賦值時的默認值。 &#xff08;default為空給定默認值&#xff09; PRIMARY…

Three.js + React 實戰系列 - 聯系方式提交表單區域 Contact 組件?(表單綁定 + 表單驗證)

對個人主頁設計和實現感興趣的朋友可以訂閱我的專欄哦&#xff01;&#xff01;謝謝大家&#xff01;&#xff01;&#xff01; 在現代網頁中&#xff0c;一個精致的 Contact 區域不僅僅是表單的堆砌&#xff0c;更是用戶與我們建立聯系的第一印象。 在本節課中&#xff0c;我…

UOJ 164【清華集訓2015】V Solution

Description 給定序列 a ( a 1 , a 2 , ? , a n ) a(a_1,a_2,\cdots,a_n) a(a1?,a2?,?,an?)&#xff0c;另有序列 h h h&#xff0c;初始時 h a ha ha. 有 m m m 個操作分五種&#xff1a; add ? ( l , r , v ) \operatorname{add}(l,r,v) add(l,r,v)&#xff1a;…