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處理
相關文章
- 什麼是網路堆疊?
- JS 堆疊JS
- 平衡堆疊
- 堆疊圖
- C#堆疊(Stack)C#
- Java堆疊的區別有哪些Java
- 資料結構的概念、堆疊資料結構
- [golang]如何看懂呼叫堆疊Golang
- 益智補劑:Stamets堆疊
- C中關於堆疊的總結
- 不一樣的 Android 堆疊抓取方案Android
- bzoj2253 紙箱堆疊
- junkman 遠端堆疊監控
- iOS crash 日誌堆疊解析iOS
- (js佇列,堆疊) (FIFO,LIFO)JS佇列
- StackOverflowError堆疊溢位錯誤Error
- 華為裝置堆疊原理
- K8S 生態週報| Podman 開始廢棄 CNI plugins, 推進自己的網路堆疊K8SPlugin
- android 解碼混淆過的堆疊資訊Android
- 堆疊溢位報錯引發的思考
- 堆疊的實現(1)--靜態陣列陣列
- JS中堆疊記憶體的練習JS記憶體
- javascript堆疊記憶體分配的區別JavaScript記憶體
- Python實現堆疊與佇列Python佇列
- 【matplotlib 實戰】--堆疊面積圖
- JS 資料型別和堆疊JS資料型別
- QT分局管理:堆疊窗體(三)QT
- CSS之定位和堆疊屬性CSS
- echarts 堆疊面積階梯圖Echarts
- SQL隱碼攻擊-堆疊注入SQL
- golang: 返回錯誤時列印堆疊Golang
- 從零開始的堆疊卡片控制元件控制元件
- Java獲取堆疊資訊的3種方法Java
- 堆疊和記憶體的關係 細說記憶體
- [JVM工具(1)] 堆疊檢查利器jstat的使用JVMJS
- win10找不到無線網路報錯:Windows無法自動將IP協議堆疊繫結到網路介面卡Win10Windows協議
- Java之String和StringBuffer堆疊圖分析Java
- information_schema.innodb_trx 查詢堆疊ORM