RPC(Remote Procedure Call),遠程過程調用,大部分的RPC框架都遵循以下三個開發步驟:java
1. 定義一個接口說明文件:描述了對象(結構體)、對象成員、接口方法等一系列信息;
2. 經過RPC框架所提供的編譯器,將接口說明文件編譯成具體的語言文件;
3. 在客戶端和服務器端分別引入RPC編譯器所生成的文件,便可像調用本地方法同樣調用服務端代碼;編程
一、客戶過程以正常方式調用客戶樁(client stub,一段代碼);
二、客戶樁生成一個消息,而後調用本地操做系統;
三、客戶端操做系統將消息發送給遠程操做系統;
四、遠程操做系統將消息交給服務器樁(server stub,一段代碼);
五、服務器樁將參數提取出來,而後調用服務器過程;
六、服務器執行要求的操做,操做完成後將結果返回給服務器樁;
七、服務器樁將結果打包成一個消息,而後調用本地操做系統;
八、服務器操做系統將含有結果的消息發送回客戶端操做系統;
九、客戶端操做系統將消息交給客戶樁;
十、客戶樁將結果從從消息中提取出來,返回給調用它的客戶過程;json
流量消耗。RESTful API 在應用層使用 HTTP 協議,哪怕使用輕型、高效、傳輸效率高的 JSON 也會消耗較大的流量,而 RPC 傳輸既可使用 TCP 也可使用 UDP,並且協議通常使用二制度編碼,大大下降了數據的大小,減小流量消耗。服務器
對接異構第三方服務時,一般使用 HTPP/RESTful 等公有協議,對於內部的服務調用,應用選擇性能更高的二進制私有協議架構
Thrift是一款由Fackbook開發的可伸縮、跨語言的服務開發框架,該框架已經開源而且加入的Apache項目。Thrift主要功能是:經過自定義的Interface Definition Language(IDL),能夠建立基於RPC的客戶端和服務端的服務代碼。數據和服務代碼的生成是經過Thrift內置的代碼生成器來實現的。Thrift 的跨語言性體如今,它能夠生成C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml , Delphi等語言的代碼,且它們之間能夠進行透明的通訊。框架
圖中Your Code是用戶實現的業務邏輯,接下來的FooService.Client和Foo.write()/read()是thrift根據IDL生成的客戶端和服務端的代碼,對應於RPC中Client stub和Server stub。TProtocol 用來對數據進行序列化與反序列化,具體方法包括二進制,JSON 或者 Apache Thrift 定義的格式。TTransport 提供數據傳輸功能,使用 Apache Thrift 能夠方便地定義一個服務並選擇不一樣的傳輸協議。socket
表明thrift的數據傳輸方式,thrift定義了以下幾種經常使用數據傳輸方式編程語言
TSocket: 阻塞式socket;
TFramedTransport: 以frame爲單位進行傳輸,非阻塞式服務中使用;
TFileTransport: 以文件形式進行傳輸;工具
表明thrift客戶端和服務端之間傳輸數據的協議,通俗來說就是客戶端和服務端之間傳輸數據的格式(例如json等),thrift定義了以下幾種常見的格式性能
TBinaryProtocol: 二進制格式;
TCompactProtocol: 壓縮格式;
TJSONProtocol: JSON格式;
TSimpleJSONProtocol: 提供只寫的JSON協議;
thrift IDL不支持無符號的數據類型,由於不少編程語言中不存在無符號類型,thrift支持一下幾種基本的數據類型
此外thrift還支持如下容器類型:
thrift容器中元素的類型能夠是除了service以外的任何類型,包括exception
thirft支持struct類型,目的就是講一些數據聚合在一塊兒,方便傳輸管理,struct定義形式以下:
struct People { 1:string name; 2:i32 age; 3:string gender; }
thrift支持枚舉類型,定義形式以下:
enum Gender { MALE, FEMALE }
thrift支持自定義異常類型exception,異常定義形式以下:
exception RequestException { 1:i32 code; 2:string reason; }
thrift定義服務至關於Java中建立接口同樣,建立的service通過代碼生thrift代碼生成工具編譯後就會生成客戶端和服務端的框架代碼,service的定義形式以下:
service HelloWorldService { // service中能夠定義若干個服務,至關於Java Interface中定義的方法 string doAction(1:string name, 2:i32 age); }
thrift支持給類型定義別名,以下所示:
typedef i32 int typedef i64 long
thrift也支持常量的定義,使用const關鍵字:
const i32 MAX_RETRIES_TIME = 10; const string MY_WEBSITE = "http://facebook.com";
thrift支持命名空間,命名空間至關於Java中的package,主要用於組織代碼,thrift使用關鍵字namespace定義命名空間,格式是namespace 語言名 路徑,以下示例所示:
namespace java com.test.thrift.demo