如何用一天時間實現本身的RPC框架

前言


最近,閒來無事,本身寫了一個簡單的RPC框架,我把它叫作SimpleRpc。它有多簡單?一共只有1400行代碼。這個RPC只是做爲本身試驗做品,交流技術之用,固然若是你敢用,也能夠放到生產環境之中,只不過要自求多福。html

如今有不少開源的RPC,我用過的有ICE,thrift,grpc。我知道有不少小夥伴想閱讀以上這些開源項目的源碼,可是一頭扎進去,不免會迷了方向,畢竟這些成熟的RPC考慮了不少東西,很容易讓人陷入到某個細節不能自拔,對於理解主幹反而是一種累贅。因此,個人這個SimpleRpc就是要精簡精簡再精簡,把這些RPC的骨骼抽出來,忽略一些可用性、易用性、移植性,目的只是要小夥伴們理解RPC的主要工做流程,克服對RPC設計的恐懼。我相信,若是小夥伴們看完這個簡單的不能再簡單的設計後,本身也能順手寫出一個RPC。git

寫做思路


 若是隻用一篇博客寫完這個SimpleRpc的實現,將會使得這個博客又臭又長,小夥伴們很難一會兒所有消化掉。因此,我準備一一系列博客寫完這個RPC,這樣作的好處在於能夠在每篇博客中詳細講一個設計要點,每一個部分都成爲一個單獨的設計點存在,這樣就使得這個設計有主次之分,有階段性理解。github

固然,我在本篇博客中附件中附上源代碼,小夥伴能夠去看:https://github.com/haolujun/SimpleRpc設計模式

SimpleRpc-系統邊界以及總體架構網絡

SimpleRpc-序列化與反序列化的設計與實現架構

SimpleRpc-網絡事件響應Reactor設計模式框架

SimpleRpc-客戶端與服務端工做模型探討post

使用樣例


在進行具體介紹以前,咱們先貼上客戶端與服務端的樣例代碼,讓你們熟悉一下這個rpc的使用方法。咱們開發一個作加法計算的服務和客戶端,客戶端每次發送給服務端兩個數字,服務端把相加後獲得的結果返回給客戶端。spa

客戶端代碼:設計

 1 #include <string>                                   
 2 #include "Add.h"
 3 #include "SimpleRpc.h"                                                                                               
 4 
 5 int main(){
 6   Server server(
 7     std::string("add"), 
 8     std::string("add"), 
 9     std::string("127.0.0.1"), 
10     std::string("27008")
11   );     
12   
13   CalcRequest req;                                
14   req.set_a(100);                      
15   req.set_b(100);
16   AddRequest add_request;
17   AddResponse add_response;
18   add_request.set_req(req);
19 
20   for(int i = 0; i < 10; ++i) {
21     SimpleRpcClient::get_instance()->request(
22       server, (Request*)&add_request, (Response*)&add_response);
23     printf("result = %d\n", add_response.get_response().result());
24   }
25 
26   return 0;
27 }

服務端代碼:

 1 #include "Add.h"
 2 #include "SimpleRpc.h"                                 
 3 
 4 int main(){
 5   std::string service_name("add");
 6   SimpleRpcService<AddRequest, AddResponse, AddProcessorFactory> *service_add;
 7   service_add = new SimpleRpcService<AddRequest, AddResponse, AddProcessorFactory>(                                  
 8     std::string("27008"), service_name);
 9   service_add->start();
10   return 0;

固然這裏面忽略了一些額外還須要咱們寫的代碼,我只要給各位小夥伴留一個直白印象。除了標記成紅色的類以外,小夥伴還需實現AddProcessor這個類便可。AddProcessor類以下:

class AddProcessor : public Processor<AddRequest, AddResponse>{                                                      
  public:
    int process(AddRequest &request, AddResponse &response) {                                                        
      CalcRequest req = request.get_req();                                                                           
      CalcResponse resp;
      resp.set_result(req.a() + req.b());                                                                            
      response.set_response(resp);                                                                                   
      return 0;                                                                                                      
    }                                                                                                                
}
相關文章
相關標籤/搜索