Apache Thrift 是Facebook 實現的一種高效的、支持多種編程語言的遠程服務調用的框架。它結合了功能強大的軟件堆棧和代碼生成引擎,以構建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa,JavaScript, Node.js, Smalltalk, and OCaml 這些編程語言間無縫結合的、高效的服務。java
最初由facebook開發,07年四月開放源碼,08年5月進入apache孵化器。apache
1、基本類型編程
①bool:布爾值,true 或 false,對應 Java 的 Booleanjson
②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類型
2、結構體類型
①struct:定義公共的對象,相似於 C 語言中的結構體定義,在 Java 中是一個 JavaBean
※不支持繼承
3、容器類型
①list:列表。對應 Java 的 ArrayList
②set:集合。對應 Java 的 HashSet
③map:對應 Java 的 HashMap
4、異常類型
①exception:對應 Java 的 Exception
5、服務類型
①service:對應服務的類
※支持繼承
6、常量
①const 類型 變量名=值
※在java中會把定義的常量都生成到一個public類型的Constant類中
7、類型定義
①typedef i32 MyInteger
※C/C++風格,java不支持
8、枚舉類型
①enum EnumType
※不支持類型嵌套,枚舉常量必須是32位的正整數;
9、其餘
①註釋
支持#,/**/,//類型的註釋風格。建議使用/**/和//類型註釋。
②命名空間
namespacejava com.kongfz.pm
說明:a、namespace爲關鍵字
b、java爲語言定義
c、com.kongfz.pm爲空間名稱,至關於java的package
③文件包含
include"othre.thrift"
10、
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與其餘傳輸方式的比較:
一、xml與JSON相比體積太大,可是xml傳統,也不算複雜;
二、json 體積較小,新穎,但不夠完善;
三、thrift 體積超小,使用起來比較麻煩,不如前二者輕便,可是對於高併發、數據傳輸量大、多語言環境, 知足其中2點使用 thrift仍是值得的。
假定須要傳輸相同的內容,但使用不一樣的方式從 a、傳輸內容所產生的大小b、傳輸過程當中服務端和客戶端所產生的開銷,這2個方便進行比較。
使用Thrift和其餘方式的所產生的內容大小比較結果以下:
使用Thrift和其餘方式的運行資源佔用比較: