Jaeger tchannel-go —— readme原始碼閱讀

cdh0805010118發表於2018-07-19

TChannel

TChannel 是一個支援多路複用和幀協議的 RPC 框架。tchannel-go 是這個協議的 Go 版本實現,包括 Hyperbahn 的客戶端庫。

如果你想要首先編寫一個小型 Thrift 和 TChannel 服務,請檢視本指南。如果你不喜歡這個指南,可以幫忙做一些貢獻.

總覽

TChannel 是一個網路協議,它支援:

  • 一個 request/response 模型;
  • 在同一個 TCP socket 上覆用多個請求;
  • 無序響應;
  • 流請求和流響應;
  • Checksummed 幀;
  • 任意負載的傳輸;
  • 多語言的實現簡單;
  • 類似 redis 的高效能;

這個協議為 IPC,意圖執行在資料中心網路上。

協議

TChannel 幀有個固定長度的頭部和 3 個可變長度欄位。底層協議沒有給這些欄位賦予含義,但是 client/server 實現使用第一個欄位去表示 RPC 模型中唯一 endpoint 或者函式名稱。接下來的兩個欄位可用於任意資料。對於這三個欄位的使用,有些建議如下:

  • URI path + HTTP method and headers as JSON + body
  • Function name + headers + thrift/protobuf

上面兩條建議,都是針對 arg3 個引數賦予了含義,

對於第一條建議:

  1. arg1 為 URI 路徑;
  2. arg2 為 HTTP 的請求 method 和 headers;
  3. arg3 為 HTTP 的 body 資料

對於第二條建議:

  1. arg1 為方法名;
  2. arg2 為 headers
  3. arg3 為 thrift/protobuf 的序列化資料

注意,TChannel 編碼只支援 UTF-8。如果你想要使用 JSON,你需要在 TChannel 之外進行字串化和解析。

這個設計支援高效路由和路由轉發:routers 需要解析第一個或者第二個欄位,但是沒有解析也能夠轉發第三個欄位;

在這個系統中沒有客戶端和服務端之前的概念。每個 TChannel 例項能夠發起和接收請求,只要求一個可以監聽的唯一埠。這個要求可能未來會發生變化。

詳見protocol specification

例子:

  • ping。一個使用 raw TChannel 的 ping/pong 例子。
  • thrift。一個使用 Thrift 協議的 client/server 例子。
  • keyvalue。 具有單獨 server 和 client 二進位制的一個 keyvalue Thrift 服務
更多原創文章乾貨分享,請關注公眾號
  • Jaeger tchannel-go —— readme原始碼閱讀
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章