Apache Thrift 是Facebook 實現的一種高效的、支持多種編程語言的遠程服務調用的框架。它結合了功能強大的軟件堆棧和代碼生成引擎,以構建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa,JavaScript, Node.js, Smalltalk, and OCaml 這些編程語言間無縫結合的、高效的服務。
最初由facebook開發,07年四月開放源碼,08年5月進入apache孵化器。
架構圖
數據類型
一、基本類型
①bool:布爾值,true 或 false,對應 Java 的 Boolean
②byte:8 位有符號整數,對應 Java 的 byte
③i16:16 位有符號整數,對應 Java 的 short
④i32:32 位有符號整數,對應 Java 的 int
⑤i64:64 位有符號整數,對應 Java 的 long
⑥double:64 位浮點數,對應 Java 的 double
⑦string:未知編碼文本或二進制字符串,對應 Java 的 String
※在使用PHP時要注意i64類型
二、結構體類型
①struct:定義公共的對象,類似於 C 語言中的結構體定義,在 Java 中是一個 JavaBean
※不支持繼承
三、容器類型
①list:列表。對應 Java 的 ArrayList
②set:集合。對應 Java 的 HashSet
③map:對應 Java 的 HashMap
四、異常類型
①exception:對應 Java 的 Exception
五、服務類型
①service:對應服務的類
※支持繼承
六、常量
①const 類型 變量名=值
※在java中會把定義的常量都生成到一個public類型的Constant類中
七、類型定義
①typedef i32 MyInteger
※C/C++風格,java不支持
八、枚舉類型
①enum EnumType
※不支持類型嵌套,枚舉常量必須是32位的正整數;
九、其他
①註釋
支持#,/**/,//類型的註釋風格。建議使用/**/和//類型註釋。
②命名空間
namespacejava com.kongfz.pm
說明:a、namespace爲關鍵字
b、java爲語言定義
c、com.kongfz.pm爲空間名稱,相當於java的package
③文件包含
include"othre.thrift"
十、
協議
Thrift 可以讓用戶選擇客戶端與服務端之間傳輸通信協議的類別,在傳輸協議上總體劃分爲文本 (text) 和二進制 (binary) 傳輸協議,爲節約帶寬,提高傳輸效率,一般情況下使用二進制類型的傳輸協議爲多數,有時還會使用基於文本類型的協議,這需要根據項目 / 產品中的實際需求。常用協議有以下幾種:
①TBinaryProtocol——進制編碼格式協議
②TCompactProtocol——壓縮的二進制編碼格式協議
③TJSONProtocol ——JSON格式的編碼格式協議
④TSimpleJSONProtocol——只提供JSON 只寫的協議(適用於通過腳本語言解析)
⑤TDebugProtocol——供開發調試使用
傳輸層
常用的傳輸層有一下幾種:
①TSocket——使用阻塞式I/O進行傳輸。也是最常用模式;
②TFrameTransport——非阻塞方式。以幀爲單位傳輸;
③TNonblockingTransport——使用非阻塞方式,用於構建異步客戶端
④TMemoryTransport- 使用內存I/O,就好比Java中的ByteArrayOutputStream實現。
⑤TFileTransport——按照文件的方式傳輸,不支持java;
⑥TZlibTransport- 使用執行zlib壓縮,不提供Java的實現
※②和③的區別:②的非阻塞方式是服務端非阻塞,客戶端是阻塞的;③是異步方式調用,客戶端需要使用回調函數來處理返回結果。
※應用最廣泛的是①、②和③
服務端類型
常見的服務端類型有:
①TSimpleServer——單線程服務端使用標準的阻塞式I/O;
②TThreadPoolServer——多線程服務端使用標準的阻塞式I/O;
※需要根據服務器的具體情況設置最大和最小線程數,以保證服務器最佳性能
③TNonblockingServer——多線程服務端使用的非阻塞式I/O
命令
thrift-r --gen java xxx.thrift
其中:
thrift:是thrift的執行命令;
r:生成包含文件;
java:要生成代碼的語言;
gen:表示動態生成代碼的標誌;
xxx.thrift:thrift的定義文件
關鍵字
常用的關鍵字有:
①required:在struct中定義時使用,表示該字段必須有值——系統檢查;
②optional:在struct中定義時使用,表示該字段是可選的,有值也行無值也可;無值時不會被序列化、也不會被傳輸;
③oneway:在service中修飾方法時使用,表示client發出請求後不必等待回覆,直接進行後面的操作。另外,該方法的返回值必須是void類型;
④const:除了定義常量以外,可以修飾方法的參數,表示參數時只讀的,不能修改和返回。
比較
Thrift與其他傳輸方式的比較:
1、xml與JSON相比體積太大,但是xml傳統,也不算複雜;
2、json 體積較小,新穎,但不夠完善;
3、thrift 體積超小,使用起來比較麻煩,不如前兩者輕便,但是對於高併發、數據傳輸量大、多語言環境, 滿足其中2點使用 thrift還是值得的。
假定需要傳輸相同的內容,但使用不同的方式從 a、傳輸內容所產生的大小b、傳輸過程中服務端和客戶端所產生的開銷,這2個方便進行比較。
使用Thrift和其他方式的所產生的內容大小比較結果如下:
使用Thrift和其他方式的運行資源佔用比較: