Thrift 網(wǎng)絡(luò)棧
Apache Thrift 網(wǎng)絡(luò)棧的簡單表示
+-------------------------------------------+
| Server |
| (single-threaded, event-driven etc) |
+-------------------------------------------+
| Processor |
| (compiler generated) |
+-------------------------------------------+
| Protocol |
| (JSON, compact etc) |
+-------------------------------------------+
| Transport |
| (raw TCP, HTTP etc) |
+-------------------------------------------+
傳輸層 Transport
傳輸層為從網(wǎng)絡(luò)讀取/寫入提供了一個簡單的抽象。這使得 Thrift 能夠?qū)⒌讓觽鬏斉c系統(tǒng)的其他部分分離(例如:序列化/反序列化)。
以下是傳輸層接口暴露的一些方法:
- open
- close
- read
- write
- flush
除上述傳輸接口外,Thrift還使用 ServerTransport 接口來接受或創(chuàng)建原始傳輸對象。顧名思義,ServerTransport 主要用于服務(wù)器端,為進來的連接創(chuàng)建新的傳輸對象。
- open
- listen
- accept
- close
以下是在 Thrift 支持的語言中,絕大多數(shù)均可用的一些傳輸:
- file:讀取/寫入磁盤上的文件
- http:顧名思義
協(xié)議 Protocol
對協(xié)議的抽象定義了一種將內(nèi)存數(shù)據(jù)結(jié)構(gòu)映射為線上傳輸格式的機制。換句話說,一個協(xié)議指定了數(shù)據(jù)類型如何使用底層傳輸來對自己進行編碼/解碼。因此,協(xié)議的實現(xiàn)決定編碼方案并負責(zé)(反)序列化。在這個意義上,一些常見協(xié)議的例子包括 JSON、XML、純文本、緊湊的二進制文件等。
下面是 協(xié)議 的接口:
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 協(xié)議是面向流而設(shè)計的。不需要任何顯式的組幀操作。例如,在我們開始序列化它們之前,不需要知道字符串的長度或列表中的元素的個數(shù)。一些 Thrift 支持的語言可用的協(xié)議有:
- 二進制:相當簡單的二進制編碼 - 字段的長度和類型被編碼為字節(jié),然后是字段的實際值。
- 緊湊式:在THRIFT-110中描述
- JSON
處理器 Processor
處理器封裝了從輸入流中讀取數(shù)據(jù)并寫入輸出流的能力。輸入和輸出流由協(xié)議對象表示。處理器接口非常簡單
interface TProcessor {
bool process(TProtocol in, TProtocol out) throws TException
}
服務(wù)特定的處理器實現(xiàn)由編譯器生成。處理器本質(zhì)上是從線路上讀取數(shù)據(jù)(使用輸入?yún)f(xié)議),將處理委托給處理程序(由用戶實現(xiàn)),并在線路上(使用輸出協(xié)議)寫入響應(yīng)。
服務(wù)器 Server
服務(wù)器將上述所有各種功能匯集在一起??:
- 創(chuàng)建傳輸對象
- 為傳輸對象創(chuàng)建輸入/輸出協(xié)議
- 根據(jù)輸入/輸出協(xié)議創(chuàng)建處理器
- 等待傳入連接并將它們交給處理器