这是我参与「第五届青训营 」伴学笔记创作活动的第 6 天
kitex
Kitex是字节内部的一款针对 golang 微服务研发的 PRC 框架。既然是 RPC,底层就需要两大功能:
- Serialization 序列化
- Transport 传输
Kitex 框架及命令行工具,默认支持 thrift 和 proto3 两种 IDL,对应的 Kitex 支持 thrift 和 protobuf 两种序列化协议。 传输上 Kitex 使用扩展的 thrift 作为底层的传输协议(注:thrift 既是 IDL 格式,同时也是序列化协议和传输协议)。
IDL
是什么
IDL 是 Interface description language 的缩写,指接口描述语言,是规范的一部分,是跨平台开发的基础。常见的 IDL 协议有两种:thrift 和 proto3
为什么要使用 IDL
如果我们要进行 RPC,就需要知道对方的接口是什么,需要传什么参数,同时也需要知道返回值是什么样的,就好比两个人之间交流,需要保证在说的是同一个语言、同一件事。 这时候,就需要通过 IDL 来约定双方的协议,就像在写代码的时候需要调用某个函数,我们需要知道函数签名一样。
- Thrift IDL 语法可参考:Thrift interface description language。
- proto3 语法可参考:Language Guide(proto3)。
以下为 thrift 格式的接口定义
// 命名空间,服务名称
namespace go api
struct Request {
1: string message
}
struct Response {
1: string message
}
// 声明此服务的接口
service Echo {
// 声明此服务的方法
Response echo(1: Request req)
}
操作
使用以下命令生成 kitex 相关代码
kitex -module bytedance-study -service Echo demo.thrift
其中
kitex_gen/IDL 内容相关的生成代码,主要是基础的 C/S 代码script/启动脚本文件夹build.sh构建脚本demo.thrift用户定义的 IDL 文件handler.gorpc 服务实现接口,用户在该文件里实现 IDL service 定义的方法main.go程序入口
运行服务
- 服务默认监听 8888 端口
- 按规定格式发起请求 client/main.go
go run main.go handler.go
client
需要注意的是,kitex 生成的代码操作仅局限于服务端范畴,客户端调用部分需要用户自行实现。还是以上述定义的 demo.thrift 文件为例,其接口方法调用逻辑如下:
func main() {
serviceName := "echo" // 服务发现使用
c, err := echo.NewClient(serviceName, client.WithHostPorts("0.0.0.0:8888"))
if err != nil {
log.Fatal(err)
}
req := &api.Request{
Message: "message",
}
resp, err := c.Echo(context.Background(), req, callopt.WithRPCTimeout(3*time.Second))
if err != nil {
log.Fatal(err)
}
log.Println(resp)
}