Kitex 編解碼(協(xié)議)擴展

2022-04-27 10:34 更新

Kitex 支持擴展協(xié)議,包括整體的 Codec 和 PayloadCodec。通常 RPC 協(xié)議中包含應用層傳輸協(xié)議和 Payload 協(xié)議,如 HTTP/HTTP2 屬于應用層傳輸協(xié)議,基于 HTTP/HTTP2 可以承載不同格式和不同協(xié)議的 Payload。

Kitex 默認支持內(nèi)置的 TTHeader 傳輸協(xié)議,Payload 支持 Thrift 、KitexProtobuf、gRPC。另外,Kitex 集成 netpoll-http2 支持 HTTP2,目前主要用于 gRPC,后續(xù)會考慮基于 HTTP2 支持 Thrift。

TTHeader 協(xié)議定義如下,通過 TTHeader 可以透傳服務信息,便于服務治理。

*  TTHeader Protocol
*  +-------------2Byte--------------|-------------2Byte-------------+
*  +----------------------------------------------------------------+
*  | 0|                          LENGTH                             |
*  +----------------------------------------------------------------+
*  | 0|       HEADER MAGIC          |            FLAGS              |
*  +----------------------------------------------------------------+
*  |                         SEQUENCE NUMBER                        |
*  +----------------------------------------------------------------+
*  | 0|     Header Size(/32)        | ...
*  +---------------------------------
*
*  Header is of variable size:
*  (and starts at offset 14)
*
*  +----------------------------------------------------------------+
*  | PROTOCOL ID  |NUM TRANSFORMS . |TRANSFORM 0 ID (uint8)|
*  +----------------------------------------------------------------+
*  |  TRANSFORM 0 DATA ...
*  +----------------------------------------------------------------+
*  |         ...                              ...                   |
*  +----------------------------------------------------------------+
*  |        INFO 0 ID (uint8)      |       INFO 0  DATA ...
*  +----------------------------------------------------------------+
*  |         ...                              ...                   |
*  +----------------------------------------------------------------+
*  |                                                                |
*  |                              PAYLOAD                           |
*  |                                                                |
*  +----------------------------------------------------------------+

Codec 定義

Codec 接口定義如下:

// Codec is the abstraction of the codec layer of Kitex.
type Codec interface {
	Encode(ctx context.Context, msg Message, out ByteBuffer) error

	Decode(ctx context.Context, msg Message, in ByteBuffer) error

	Name() string
}

Codec 是整體的編解碼接口,結(jié)合需要支持的傳輸協(xié)議和 Payload 進行擴展,根據(jù)協(xié)議類型調(diào)用 PayloadCodec 接口,其中 Decode 需要進行協(xié)議探測判斷傳輸協(xié)議和 Payload。Kitex 默認提供 defaultCodec 擴展實現(xiàn)。

PayloadCodec 定義

PayloadCodec 接口定義如下:

// PayloadCodec is used to marshal and unmarshal payload.
type PayloadCodec interface {
	Marshal(ctx context.Context, message Message, out ByteBuffer) error

	Unmarshal(ctx context.Context, message Message, in ByteBuffer) error

	Name() string
}

Kitex 默認支持的 Payload 有 Thrift、Kitex Protobuf 以及 gRPC 協(xié)議。其中 Kitex Protobuf 是 Kitex 基本 Protobuf 定義的消息協(xié)議,協(xié)議定義與 Thrift Message 類似。

特別地,Kitex 的泛化調(diào)用也是通過擴展 PayloadCodec 實現(xiàn):


默認的 Codec

如果用戶不指定 Codec ,則使用默認的內(nèi)置 Codec。

  • 指定默認 Codec 的包大小限制,默認無限制 option: ?codec.NewDefaultCodecWithSizeLimit ?

maxSizeBytes = 1024 * 1024 * 10 // 10 MB

// server side
svr := stservice.NewServer(handler, server.WithCodec(codec.NewDefaultCodecWithSizeLimit(maxSizeBytes)))

// client side
cli, err := xxxservice.NewClient(targetService, client.WithCodec(codec.NewDefaultCodecWithSizeLimit(maxSizeBytes)))

指定自定義 Codec 和 PayloadCodec 

通過 option 指定 Codec 和 PayloadCodec。

  • 指定 Codec option: ?WithCodec?

// server side
svr := stservice.NewServer(handler, server.WithCodec(yourCodec))

// client side
cli, err := xxxservice.NewClient(targetService, client.WithCodec(yourCodec))

  • 指定 PayloadCodec option: ?WithPayloadCodec ?

// server side
svr := stservice.NewServer(handler, server.WitWithPayloadCodechCodec(yourPayloadCodec))

// client side
cli, err := xxxservice.NewClient(targetService, client.WithPayloadCodec(yourPayloadCodec))


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號