RPC框架實現(一) Protobuf的rpc實現
概述
RPC框架是雲端服務基礎框架之一,負責雲端服務模組之間的專案呼叫,類似於本地的函式呼叫一樣方便。常見的RPC框架配帶的功能有:
- 編解碼協議。比如protobuf、thrift等等。
- 服務發現。指服務提供者更新介面後,服務使用者如何知道該介面更新。Protobuf協議使用的是預編譯方式,dubbo中使用的是zk作為媒介。
- 負載均衡。
- 流量控制、熔斷。
- 運維工具。
常見RPC框架有
- 谷歌的GRPC。
- 百度的BRPC。
- 阿里的dubbo。
- 臉書的thrift。
- 騰訊的tars。
本系列主要教大家如何實現RPC框架,使用的語音是C++,協議使用的是protobuf。
基於protobuf的RPC框架
這裡不介紹具體protoc的使用方法,網上很多。在完成protoc編譯後,會輸出protobuf提供的服務框架中,主要有如下幾個類
- Controller,主要是rpc通訊過程的輔助介面,記錄錯誤狀態和簡單的控制。
- Service,指特定的一個服務。在protobuf中,一個服務(service)可以包含多個方法(method),通過service+method可以唯一確定一個過程。
- Channel,指使用者和提供者直接的連線通道,是protobuf的核心,但是rpc框架開發者一般不直接呼叫該類,而是呼叫下面的stub(樁/存根)。
- Stub,客戶端使用的存根,通過該類去發起遠端過程呼叫。至於為什麼需要stub,筆者也還沒有弄清楚。
在整體框架實現上基本上整合protobuf提供的類即可,採用boost的socket進行通訊,暫時考慮同步通訊的情況。
對於服務端和客戶端的通訊協議上,採用的meta物件,用於記錄過程呼叫的引數、具體service和method。
服務端設計
採用boost的socket,直接bind和監聽,啟動後則通過accept進行阻塞,對於每個請求進行解包,並在ProcRpcMsg函式中對具體業務操作函式的呼叫,並在業務操作函式完成後通過done->Run()回撥OnCallbackDone實現資料回寫。
在service的callmethod方法中,對具體method進行呼叫。
此外,在服務和過程的管理上,服務端建立了key-val的map來進行管理。
客戶端設計
客戶端相對簡單,也是基於boost的socket進行connect、send、receive等同步的操作。
在echo例子中,我們通常呼叫stub的函式,stub呼叫channel的Callmethod函式,因此我的操作需要在Channel::CallMethod中進行實現。
總結
本文簡單介紹了基於protobuf的rpc框架實現,都是使用同步模型且單執行緒形式。這個程式在狀態控制、併發高等上還不夠,下篇文章講如何提升收發效率。
程式碼路徑:https://github.com/thszhong/srpc
&n