簡介
架構
Thrift包含一套完整的棧來創建客戶端和服務端程式。頂層部分是由Thrift定義生成的代碼。而服務則由這個檔案客戶端和處理器代碼生成。在生成的代碼里會創建不同於內建類型的數據結構,並將其作為結果傳送。協定和
傳輸層是
運行時庫的一部分。有了Thrift,就可以定義一個服務或改變通訊和傳輸協定,而無需重新編譯代碼。除了客戶端部分之外,Thrift還包括伺服器基礎設施來集成協定和傳輸,如阻塞、非阻塞及多執行緒伺服器。棧中作為I/O基礎的部分對於不同的語言則有不同的實現。
Thrift支持眾多通訊協定:
TBinaryProtocol – 一種簡單的二進制格式,簡單,但沒有為空間效率而最佳化。比文本協定處理起來更快,但更難於
調試。
TCompactProtocol – 更緊湊的二進制格式,處理起來通常同樣高效。
TDebugProtocol – 一種人類可讀的文本格式,用來協助調試。
TDenseProtocol – 與TCompactProtocol類似,將傳輸數據的元信息剝離。
TJSONProtocol – 使用
JSON對數據編碼。
TSimpleJSONProtocol – 一種只寫協定,它不能被Thrift解析,因為它使用JSON時丟棄了元數據。適合用腳本語言來解析。
支持的傳輸協定有:
TFileTransport – 該傳輸協定會寫檔案。
TFramedTransport – 當使用一個非阻塞伺服器時,要求使用這個傳輸協定。它按幀來傳送數據,其中每一幀的開頭是長度信息。
TMemoryTransport – 使用存儲器映射輸入輸出。(Java的實現使用了一個簡單的ByteArrayOutputStream。)
TSocket – 使用阻塞的套接字I/O來傳輸。
TZlibTransport – 用
zlib執行壓縮。用於連線另一個傳輸協定。
Thrift還提供眾多的伺服器,包括:
優點
Thrift一些已經明確的優點包括:
跟一些替代選擇,比如
SOAP相比,跨語言序列化的代價更低,因為它使用二進制格式。
它有一個又瘦又乾淨的庫,沒有編碼框架,沒有
XML配置檔案。
綁定感覺很自然。例如,
Java使用java.util.ArrayList<String>;
C++使用std::vector<std::string>。
套用層通訊格式與序列化層通訊格式是完全分離的。它們都可以獨立修改。
預定義的序列化格式包括:二進制格式、對HTTP友好的格式,以及緊湊的二進制格式。
協定使用軟版本號機制軟體版本管理。Thrift不要求一個中心化的和顯式的版本號機制,例如主版本號/次版本號。松耦合的團隊可以輕鬆地控制RPC調用的演進。
沒有構建依賴也不含非標準化的軟體。不存在不兼容的軟體許可證混用的情況。
創建一個Thrift服務
Thrift由C++編寫,但可以為眾多語言創建代碼。要創建一個Thrift服務,必須寫一些Thrift檔案來描述它,為目標語言生成代碼,並且寫一些代碼來啟動伺服器及從客戶端調用它。
Thrift將由這個描述信息生成獨立的代碼。例如,在Java里,PhoneType將是Phone類中一個簡單的enum。
參見
自由軟體主題
數據序列化格式比較
Apache Avro
SDXF(結構化數據交換格式)