Thrift的網路堆疊
網路堆疊結構簡圖
+-------------------------------------------+
| Server |
| (single-threaded, event-driven etc) |
+-------------------------------------------+
| Processor |
| (compiler generated) |
+-------------------------------------------+
| Protocol |
| (JSON, compact etc) |
+-------------------------------------------+
| Transport |
| (raw TCP, HTTP etc) |
+-------------------------------------------+
Transport
Transport在網路上對讀寫、收發提供了簡單的抽象,例如序列化和反序列化。
通過Transport的介面提供瞭如下的方法:
- open / close / read / write / flush
ServerTransport
顧名思義,ServerTransport用於server端為新收到的連線建立原始的傳輸。
- open / listen / accept / close
以下是大多數Thrift支援的語言可用的傳輸方式:
- file: 檔案讀寫
- http:網路傳輸
Protocol
抽象定義了一種將記憶體資料對映為有線格式數的機制,換句話說,協議指定資料型別如何使用基礎傳輸來對自身編碼解碼。
Thrift的Protocol 面向流設計,無需任何明確的框架,意思就是說在編碼解碼的時候我們不需要知道資料的長度(string length / list items length)
支援的型別:
- binary
- compat(緊湊資料)
- json
示例:xml json 純文字 緊湊的二進位制
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()
Processor
Processor封裝了資料讀寫的輸入輸出流,輸入輸出流是Protocol的物件。
介面如下,非常簡單
interface TProcessor {
bool process(TProtocol in, TProtocol out) throws TException
}
具體的實現是通過編譯器實現,讀寫資料是通過輸入輸出流。
Server
伺服器將上訴的所有功能彙總
- 建立Transport
- 為Transport建立輸入輸出流物件(Protocol)
- 為輸入輸出流(Protocol)建立processor
- 等待連線並且把連線交給Processor處理
相關文章
- 什麼是網路堆疊?
- 深入Linux網路核心堆疊(轉)Linux
- 網路管理小常識:堆疊和級聯的區別(轉)
- JS 堆疊JS
- java堆疊Java
- 堆疊的工作原理
- 圖的深度優先遍歷[非堆疊、堆疊實現]
- golang 網路框架之 thriftGolang框架
- C#中堆和堆疊的區別C#
- 圖的深度優先遍歷(堆疊實現和非堆疊實現)
- 記憶體堆疊記憶體
- C#堆疊(Stack)C#
- Java堆疊的區別有哪些Java
- [golang]如何看懂呼叫堆疊Golang
- 華為裝置堆疊原理
- C++堆疊詳解C++
- 泛型鏈式堆疊泛型
- 第六講 堆疊操作
- 益智補劑:Stamets堆疊
- C中關於堆疊的總結
- java 堆疊的使用方法說明Java
- 函式呼叫中堆疊的個人理解函式
- junkman 遠端堆疊監控
- Java 堆疊記憶體分配Java記憶體
- iOS crash 日誌堆疊解析iOS
- (js佇列,堆疊) (FIFO,LIFO)JS佇列
- z-index堆疊規則Index
- JS中堆疊記憶體的練習JS記憶體
- 堆疊溢位報錯引發的思考
- android 解碼混淆過的堆疊資訊Android
- javascript堆疊記憶體分配的區別JavaScript記憶體
- 不一樣的 Android 堆疊抓取方案Android
- 堆疊的實現(1)--靜態陣列陣列
- Java獲取堆疊資訊的3種方法Java
- JS 資料型別和堆疊JS資料型別
- CSS之定位和堆疊屬性CSS
- SQL隱碼攻擊-堆疊注入SQL
- QT分局管理:堆疊窗體(三)QT