參考文檔: http://dongxicheng.org/search-engine/thrift-framework-intro/html
Thrift是一個跨語言的服務部署框架,最初由Facebook於2007年開發,2008年進入Apache開源項目。Thrift經過一箇中間語言(IDL, 接口定義語言)來定義RPC的接口和數據類型,而後經過一個編譯器生成不一樣語言的代碼(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk和OCaml),並由生成的代碼負責RPC協議層和傳輸層的實現。web
Thrift的系統架構apache
Thrift包含一個完整的堆棧結構用於構建客戶端和服務器端。下圖描繪了 Thrift 的總體架構。服務器
如圖所示,圖中黃色部分是用戶實現的業務邏輯,褐色部分是根據 Thrift 定義的服務接口描述文件生成的客戶端和服務器端代碼框架,紅色部分是根據 Thrift 文件生成代碼實現數據的讀寫操做。紅色部分如下是 Thrift 的傳輸體系、協議以及底層 I/O 通訊,使用 Thrift 能夠很方便的定義一個服務而且選擇不一樣的傳輸協議和傳輸層而不用從新生成代碼。網絡
Thrift其實是實現了C/S模式,經過代碼生成工具將接口定義文件生成服務器端和客戶端代碼(能夠爲不一樣語言),從而實現服務端和客戶端跨語言的支持。用戶在Thirft描述文件中聲明本身的服務,這些服務通過編譯後會生成相應語言的代碼文件,而後用戶實現服務(客戶端調用服務,服務器端提服務)即可以了。其中protocol(協議層, 定義數據傳輸格式,能夠爲二進制或者XML等)和transport(傳輸層,定義數據傳輸方式,能夠爲TCP/IP傳輸,內存共享或者文件共享等)被用做運行時庫。數據結構
Thrift代碼產生方式多線程
Thrift的網絡棧以下所示:架構
Thrift支持的數據類型框架
Thrift 腳本可定義的數據類型包括如下幾種類型:工具
Thrift支持的傳輸格式
Thrift可讓你選擇客戶端與服務端之間傳輸通訊協議的類別,在傳輸協議上整體上劃分爲文本(text)和二進制(binary)傳輸協議, 爲節約帶寬,提供傳輸效率,通常狀況下使用二進制類型的傳輸協議爲多數,但有時會仍是會使用基於文本類型的協議,這須要根據項目/產品中的實際需求:
使用Thrift和其餘方式的所產生的內容大小比較結果以下:
在上圖中咱們能明顯看出,最臃腫的是RMI,其次是xml,使用Thrift的TCompactProtocol協議和Google 的 Protocol Buffers 相差的不算太多,相比而言仍是Google 的 Protocol Buffers效果最佳。
使用Thrift 中的協議和其餘方式的所產生的運行開銷比較結果以下:
在上圖中咱們能明顯看出,最佔資源是REST-XML協議,使用Thrift的TCompactProtocol協議和Google 的 Protocol Buffers 相差的不算太多,相比而言Thrift的TCompactProtocol協議效果最佳。
Thrift支持的傳輸方式
Thrift支持的服務模型
參考資料: