Thrift的一些概念
Thrift最初是由Facebook開發的,因為隨著流量和網絡結構的擴展,一些操作如搜索、分發、事件日誌記錄等已經超出系統的處理範圍,所以Facebook的工程師開發服務時選擇了多種不同的編程語言來達到滿意的性能、快速開發、已有庫的重用。Thrift於2007年4月開源並於2008年5月進入Apache孵化器,在2010年10月成為Apache TLP。
Thrift是一個可擴展的跨語言服務的軟件開發框架,目標是盡可能高效和無縫地跨語言進行可靠的高性能通信和數據序列化,Thrift通過中間語言(IDL, 接口定義語言)來定義RPC的接口和數據類型,利用代碼生成器生成不同語言的代碼(如C++,Java, Python, PHP. . .等),並由生成的代碼負責RPC協議層和傳輸層的實現。
Thrift網絡堆棧
+-------------------------------------------+| Server | | (single-threaded, event-driven etc) | +-------------------------------------------+ | Processor | | (compiler generated) | +-------------------------------------------+ | Protocol | | (JSON, compact etc) | +-------------------------------------------+ | Transport | | (raw TCP, HTTP etc) | +-------------------------------------------+
傳輸(Transport)
傳輸層為網絡讀取/寫入網絡提供了一個簡單的抽象,這使得Thrift能夠將底層傳輸與系統其它部分分離(如序列化/反序列化)。下面是一些Transport接口支持的方法
● open
● close
● read
● write
● flush
另外Thrift還提供了用於接收和創建基本Transport對象的ServerTransport接口。顧名思義,ServerTransport主要用於服務器端,為傳入連接創建新的Transport對象。ServerTransport接口支持的方法
● open
● listen
● accept
● close
協議(Protocol)
協議層抽象定義了將內存數據結構映射為傳輸格式的機制。換句話說,一個協議規定了數據類型如何使用Transport來對自身進行編碼/解碼。因此,協議實現管理編碼方案並負責序列化和反序列化。Protocol實現的一些例子包括JSON,XML,純文本,緊湊二進制等。
Protocol接口有
writeMessageBegin(name, type, seq) writeMessageEnd() writeStructBegin(name) writeStructEnd() writeFieldBegin(name, type, id) writeFieldEnd() writeFieldStop() writeMapBegin(ktype, vtype, size) writeMapEnd() writeListBegin(etype, size) writeListEnd() writeSetBegin(etype, size) writeSetEnd() writeBool(bool) writeByte(byte) writeI16(i16) writeI32(i32) writeI64(i64) writeDouble(double) writeString(string) name, type, seq = readMessageBegin() readMessageEnd() name = readStructBegin() readStructEnd() name, type, id = readFieldBegin() readFieldEnd() k, v, size = readMapBegin() readMapEnd() etype, size = readListBegin() readListEnd() etype, size = readSetBegin() readSetEnd() bool = readBool() byte = readByte() i16 = readI16() i32 = readI32() i64 = readI64() double = readDouble() string = readString()
Thrift的Protocol是面向流設計的,因此沒有必要去顯式分幀(framing)。比如,在開始序列化之前我們可以不用關心我們傳輸的字符串長度或者列表中元素的個數。在Thrift支持的大部分編程語言中可供使用的Protocol類型有:
- binary:簡單二進制編碼–字段長度和類型被編碼成二進制並緊跟在實際字段值後面
- compat: 詳情見THRIFT-110
- json
處理層(Processor)
處理層封裝了從輸入流中讀取數據並寫入輸出流的能力。Protocol對象即代表輸入流和輸出流。Processor接口非常簡單。
interface TProcessor { bool process(TProtocol in, TProtocol out) throws TException }
特定服務的Processor由編譯器自動生成實現。Processor通過輸入Protocol從網路上讀取數據,並將數據處理代理給用戶實現的Handler,最後通過輸出Protocol將數據寫回到網路上。
服務器層(server)
服務器層將上述所有各種功能匯集在一起??:
- 創建一個Transport
- 為Transport創建輸入/輸出Protocol
- 基於輸入/輸出Protocol創建一個Processor
- 等待傳入連接並將它們交給處Processor
Thrift的一些概念