传输协议

Kitex 支持 TTHeader、HTTP2 传输协议。

概述

通常 RPC 协议中包含 RPC 消息协议和应用层传输协议,RPC 消息协议看做是传输消息的 Payload,传输协议额外传递一些元信息通常会用于服务治理,框架的 MetaHandler 也是和传输协议搭配使用。 在微服务场景下,传输协议起到了重要的作用,如链路跟踪的透传信息通常由传输协议进行链路传递。

Kitex 目前支持两种传输协议:TTHeader、HTTP2,但实际提供配置的 Transport Protocol 是:TTHeader、GRPC、Framed、TTHeaderFramed、PurePayload。

这里做一些说明:

  • 因为 Kitex 对 Protobuf 的支持有 Kitex Protobuf 和 gRPC,为方便区分将 gRPC 作为传输协议的分类,框架会根据是否有配置 gRPC 决定使用哪个协议;
  • Framed 严格意义上并不是传输协议,只是标记 Payload Size 额外增加的 4 字节头,但消息协议对是否有 Framed 头并不是强制的,PurePayload 即没有任何头部的,所以将 Framed 也作为传输协议的分类;
  • Framed 和 TTHeader 也可以结合使用,所以有 TTHeaderFramed 。

消息协议可选的传输协议组合如下:

  • Thrift: TTHeader(建议)、Framed、TTHeaderFramed
  • KitexProtobuf: TTHeader(建议)、Framed、TTHeaderFramed
  • gRPC: HTTP2

如果想自定义消息协议和传输协议参考:编解码(协议)扩展

配置项

Client 初始化时通过 WithTransportProtocol 配置传输协议:

// client option
client.WithTransportProtocol(transport.XXX)

Server 支持协议探测(在 Kitex 默认支持的协议内),无需配置传输协议。

使用示例

Thrift + TTHeader

// client side
var opts []client.Option
opts = append(opts, client.WithTransportProtocol(transport.TTHeader))
opts = append(opts, client.WithMetaHandler(transmeta.ClientTTHeaderHandler))
cli, err := xxxservice.NewClient(targetService, opts...)

// server side no need to config transport protocol
var opts []server.Option
opts = append(opts, server.WithMetaHandler(transmeta.ServerTTHeaderHandler))
cli, err := xxxservice.NewServer(handler, opts...)

gRPC

// client side
var opts []client.Option
opts = append(opts, client.WithTransportProtocol(transport.GRPC))
opts = append(opts, client.WithMetaHandler(transmeta.ClientHTTP2Handler))
cli, err := xxxservice.NewClient(targetService, opts...)


// server side no need to config transport protocol
var opts []server.Option
opts = append(opts, server.WithMetaHandler(transmeta.ServerHTTP2Handler))
cli, err := xxxservice.NewServer(handler, opts...)

最后修改 July 18, 2023 : doc: improve context doc (#722) (fca6c87)