開源項目推薦:主流RPC開源框架及知識科普


 

一   什么是rpc框架?

先回答第一個問題:什么是RPC框架? 如果用一句話概括RPC就是:遠程調用框架(Remote Procedure Call)

 

 

 1.1   那什么是遠程調用?

      通常我們調用一個 c/c++ 中的函數,比如:  localAdd(10, 20),localAdd方法的具體實現要么是用戶自己定義的,要么是 c++ 庫函數中自帶的,

也就說  localAdd 函數 的代碼實現在本地,它是一個本地調用!

     遠程調用意思就是:被調用方法的具體實現不在程序運行本地,而是在別的某個遠程地方。

1.2  遠程調用原理

     比如 A (client) 調用 B (server) 提供的remoteAdd方法:

   首先A與B之間建立一個TCP連接;

  然后A把需要調用的方法名(這里是remoteAdd)以及方法參數(10, 20)序列化成字節流發送出去;
  B接受A發送過來的字節流,然后反序列化得到目標方法名,方法參數,接着執行相應的方法調用(可能是localAdd)並把結果30返回;

  A接受遠程調用結果,輸出30。
  RPC框架就是把我剛才說的這幾點些細節給封裝起來,給用戶暴露簡單友好的API使用。

1.3 遠程調用的優點
 解耦:當修改 server 上接口實現的代碼時,只要提供的接口不變,client完全感知不到,不用做任何變更;這種方式在跨部門,跨公司合作的時候經常用到。

 

二.  rpc框架的三大要素

     RPC就是要像調用本地的函數一樣去調遠程函數。在遠程調用時,我們需要執行的函數體是在遠程的機器上的,這就帶來了幾個新問題:

 Call ID映射。在本地調用中,函數體是直接通過函數指針來指定的。在RPC中,所有的函數都必須有自己的一個ID。需要在客戶端和服務端

分別維護一個 {函數 <--> Call ID} 的對應表。相同的函數對應的Call ID必須相同。客戶端在做遠程過程調用時,在客戶端查一下這個表,找出相應的Call ID,

附帶上Call ID 和參數信息,然后把它傳給服務端,服務端也通過查表,根據傳過來的Call ID 確定 客戶端需要調用的函數,然后執行相應函數的代碼。

Call ID映射 的Call ID可以直接使用函數名字符串,也可以使用整數ID。映射表一般就是一個哈希表。

   序列化和反序列化。在RPC中,客戶端怎么把參數值傳給遠程服務端的函數呢?客戶端跟服務端是不同機器上的不同的進程,不能通過內存來傳遞參數。

甚至有時候客戶端和服務端使用的都不是同一種語言(比如服務端用C++,客戶端用Java或者Python)。這時候就需要客戶端把參數先轉成一個字節流,

傳給服務端后,服務端再把字節流轉成自己能讀取的格式。這個過程叫序列化和反序列化。同理,從服務端返回的值也需要序列化反序列化的過程。

序列化反序列化可以自己寫,也可以使用Protobuf。

   網絡傳輸。遠程調用往往用在網絡上,客戶端和服務端是通過網絡連接的。所有的數據都需要通過網絡傳輸,因此就需要有一個網絡傳輸層。網絡傳輸層

需要把Call ID和序列化后的參數字節流傳給服務端,然后再把序列化后的調用結果傳回客戶端。大部分RPC框架都使用TCP協議,但其實UDP也可以,

而gRPC干脆就用了HTTP2。Java的Netty也屬於這層的東西。網絡傳輸庫可以自己寫socket,或者用asio,ZeroMQ,Netty之類的網絡庫。

 

三  . 大廠流行的開源RPC框架

1、Google之gprc

https://github.com/grpc/grpc

https://github.com/google/protobuf

http://doc.oschina.net/grpc

 

2、Facebook之thrift

Thrift 源於Facebook,在 2007 年 Facebook 將 Thrift 作為一個開源項目提交給了 Apache 基金會。

http://thrift.apache.org/

http://thrift.apache.org/lib/

http://thrift.apache.org/lib/cpp

https://github.com/apache/thrift

 

3、Tencent之Tars

騰訊微服務框架Tars介紹

https://github.com/TarsCloud/Tars

https://github.com/TarsCloud/TarsCpp

https://github.com/TarsCloud/TarsGo

https://github.com/Tencent/phxrpc,前身是Svrkit

https://github.com/loveyacper/ananas 熱心前騰訊大咖DIY,C++實現

 

4、Baidu之brpc

brpc又稱為baidu-rpc,是百度開發一款“遠程過程調用”網絡框架。C++實現。

https://github.com/brpc/brpc

 

5、golang之rpcx

rpcx是一個類似阿里巴巴 Dubbo 和微博 Motan 的分布式的RPC服務框架,基於Golang net/rpc實現。號稱是最好的Go語言的RPC服務治理框架,快、易用卻功能強大,性能遠遠高於 Dubbo、Motan、Thrift等框架,是gRPC性能的兩倍。

https://rpcx.io/

https://github.com/smallnest/rpcx

 

6、搜狗之srpc

Sogou基於Workflow的自研RPC框架,C++實現

https://github.com/sogou/srpc -- RPC based on Sogou C++ Workflow

https://github.com/sogou/workflow -- Sogou’s C++ Asynchronous Programming Engine

https://www.zhihu.com/people/liyingxin1412/

四.  其它小眾的開源C++ RPC


1. RCF: 純c++的RPC, 不引入IDL, 大量用到boost,比較強大.
2. casocklib:  protobuf + asio 較完善實現
3. eventrpc: protobuf + libevent 較完善實現

https://www.exit1.org/Event-RPC/
4. evproto: protobuf + libevent 簡單實現

https://github.com/chenshuo/evproto

https://github.com/chenshuo/evproto2
5. febird:同樣無IDL的c++ RPC,自己實現了串行化和網絡IO.
6. libHttp, xmlrpc 都是xml封裝的RPC

7.rest_rpc

https://github.com/topcpporg/rest_rpc

8.muduo_rpc

https://github.com/chenshuo/muduo-protorpc

https://github.com/chenshuo/muduo/tree/master/examples/protobuf

9.other

https://github.com/IronsDu/gayrpc

https://github.com/guangqianpeng/jrpc

https://github.com/hjk41/tinyrpc

https://github.com/button-chen/buttonrpc_cpp14

https://github.com/persistentsnail/easy_pb_rpc 一個基於protocol buffer的RPC實現

http://www.cnblogs.com/persistentsnail/p/3458342.html 一個基於protocol buffer的RPC實現

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM