REST RPC架構思想


1.REST RPC是什么?

  REST RPC是一個改進版的RPC架構,它是為了解決傳統的RPC和REST方案的一些不足之處而生的,它結合了REST API和RPC的優點,同時又克服了REST API和RPC的缺點。我們先來看看傳統的RPC和REST API方案的優點和一些不足之處。

1.1RPC的優點

  • 屏蔽網絡細節
  • 易用,和本地調用類似
  • 提供靈活的API
  • 支持多種協議

1.2RPC的缺點

  傳統的RPC一般是基於protobuf或thrift去實現的,這類實現方式主要有存在這幾個問題。

  • 使用麻煩,使用時需要先寫一個DSL描述文件,然后用代碼生成器生成各種語言代碼,如果model類很多的時候,這個工作就很繁瑣,工作量也較大。
  • 維護性差,當某些model類需要修改時,必須重新定義和編譯,做一些繁瑣而重復的工作。
  • 學習成本比較高,使用它們之前先要學習代碼生成器如何使用,還要學習復雜的DSL語法定義規則,而這些語法規則並不是通用的,一段時間不用之后又要重新去學習。
  • 最大問題是不能快速響應API升級,當API或者協議演進的時候,需要給客戶端提供新的SDK,當多語言的客戶端較多時,每加一個接口時都要更新一堆不同語言的SDK,這是維護升級的噩夢。

1.3REST API的優點

  輕量級,簡單易用。無需要額外的SDK,維護性和擴展性都比較好 。

1.4REST API的缺點

  只支持http協議,使用時需要關注http協議和網絡層的細節,而http協議比較臃腫。

1.5REST RPC的特點

  REST RPC則吸收RPC和REST API的優點,同時又克服了他們的主要缺點,REST RPC的API和REST API類似,服務請求api是字符串形式,支持mian/sub/sub形式的API,使用方便又無須提供專門的SDK,解決了rpc模型類定義復雜繁瑣的問題,也解決了多語言sdk更新的問題。因為api是字符串弱類型的,無需專門的多語言支持的sdk包了,還可以快速響應api和協議升級。它同時克服了rest api只能支持http協議的問題,rest rpc可以支持多種協議,http,tcp都可以,把協議和網絡細節完全屏蔽,使用者無需關心協議,就像本地調用一樣簡單。

2.REST RPC的實現形式

  REST RPC的實現形式有兩種,一種基本形式和一種變體形式,變體形式是為了克服基本形式的缺點。

2.1REST RPC基本形式

  REST API的協議是json格式的,調用者需要先將參數序列化為json字符串。 REST RPC的API是通用的,變化的只有服務端提供的API名稱和對應的參數對象,使用者傳入服務端提供的服務API名稱和參數對象對應的json字符串。

通用REST API原型:

string call(string service_name, string json);
  •  客戶端調用:
call("handler1", "{"name":"TiMax","age":20,"city":"zhuhai"}");
  • 對應的服務端處理程序:
struct Person
{
    string name;
    int age;
    string city;
};
handler1(Person p);

2.2REST RPC變體形式

  變體形式只適用於C++或其它支持可變參數的語言,它讓RPC API使用更簡單。

  REST RPC變體原型:

string call(string service_name, Args… args);
  • 客戶端調用:
call("handler2", " TiMax", 20, "zhuhai");
  • 對應的服務端處理程序
handler2(string name, int age, string city);

3.REST RPC的缺點

  REST RPC雖然解決了REST API和RPC的大部分缺點,但是它屬於弱類型的API(字符串形式的),所以無法在編譯期檢查接口的正確性,只能在運行期檢查API的正確性。 一個改進的做法是由客戶端的使用者封裝API,在API內部將結構體序列化為json,再調用通用的api,這樣可以保證在編譯期檢查API的正確性。另外一個改進方式是使用REST API變體形式,但這種形式只支持C/C++等支持可變參數的語言。


免責聲明!

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



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