序列化协议
Kitex 支持 Thrift 和 Protobuf 两种编解码。
Thrift
Kitex 支持了 Thrift 的 Binary 协议,暂时没有支持 Compact 协议。
生成代码时指定 Thrift 协议,也可以不指定,默认就是 Thrift:
-
客户端
kitex -type thrift ${service_name} ${idl_name}.thrift
-
服务端
kitex -type thrift -service ${service_name} ${idl_name}.thrift
我们针对 Thrift 的 binary 协议编解码进行了优化,具体优化细节参考 “Reference - 高性能 Thrift 编解码 " 篇章,假如想要关闭这些优化,生成代码时可以加上 -no-fast-api
参数。
Protobuf
协议说明
Kitex 对 protobuf 支持的协议有两种:
- 自定义的消息协议,可以理解为 Kitex Protobuf,使用方式与 thrift 一样
- gRPC 协议,可以与 gRPC 互通,并且支持 streaming 调用
如果 IDL 文件中定义了 streaming 方法则走 gRPC 协议,否则走 Kitex Protobuf。没有 streaming 方法,又想指定 gRPC 协议,需要 client 初始化做如下配置(server 支持协议探测无需配置) :
// 使用 WithTransportProtocol 指定 transport
cli, err := service.NewClient(destService, client.WithTransportProtocol(transport.GRPC))
生成代码
只支持 proto3,语法参考 https://developers.google.com/protocol-buffers/docs/gotutorial
注意:
- 相较其他语言,必须定义 go_package ,以后 pb 官方也会将此作为必须约束
- go_package 和 thrift 的 namespace 定义一样,不用写完整的路径,只需指定包名,相当于 thrift 的 namespace,如:go_package = “pbdemo”
- 提前下载好 protoc 二进制放在 $PATH 目录下
生成代码时需要指定 protobuf 协议:
-
客户端
kitex -type protobuf -I idl/ idl/${proto_name}.proto
-
服务端
kitex -type protobuf -service ${service_name} -I idl/ idl/${proto_name}.proto
最后修改
July 30, 2023
: fix type error (#735) (50c91bf)