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 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 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 ,則使用默認的內(nèi)置 Codec。
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)))
通過 option 指定 Codec 和 PayloadCodec。
WithCodec
?// server side
svr := stservice.NewServer(handler, server.WithCodec(yourCodec))
// client side
cli, err := xxxservice.NewClient(targetService, client.WithCodec(yourCodec))
WithPayloadCodec
?// server side
svr := stservice.NewServer(handler, server.WitWithPayloadCodechCodec(yourPayloadCodec))
// client side
cli, err := xxxservice.NewClient(targetService, client.WithPayloadCodec(yourPayloadCodec))
更多建議: