Rpc 框架 Thrift 的核心概念(翻譯)

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)建處理器
  • 等待傳入連接并將它們交給處理器

原文:https://thrift.apache.org/docs/concepts

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容