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

2022-04-27 10:34 更新

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

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

TTHeader 協(xié)議定義如下,通過(guò) TTHeader 可以透?jìng)鞣?wù)信息,便于服務(wù)治理。

*  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ìn)行擴(kuò)展,根據(jù)協(xié)議類(lèi)型調(diào)用 PayloadCodec 接口,其中 Decode 需要進(jìn)行協(xié)議探測(cè)判斷傳輸協(xié)議和 Payload。Kitex 默認(rèn)提供 defaultCodec 擴(kuò)展實(shí)現(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 默認(rèn)支持的 Payload 有 Thrift、Kitex Protobuf 以及 gRPC 協(xié)議。其中 Kitex Protobuf 是 Kitex 基本 Protobuf 定義的消息協(xié)議,協(xié)議定義與 Thrift Message 類(lèi)似。

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


默認(rèn)的 Codec

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

  • 指定默認(rèn) Codec 的包大小限制,默認(rèn)無(wú)限制 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 

通過(guò) 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)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)