这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
今天的青训营课程介绍了Kitex这个RPC框架,下面就对课程中提及到的知识点做一个记录。
IDL
IDL(Interface Description Language)文件描述了服务端与客户端之间通信的约定,里面定义了请求和响应的信息格式,并声明了服务的接口格式(可以类比为函数的签名)。通俗来讲就是对于一个暴露的接口,应当描述清楚需要传什么参数以及接口返回的类型是怎样的。
IDL文件主要有Thrift IDL和proto3 IDL两种格式:
- 对于Thrift IDL的语法,可以参考这篇文章thrift IDL 基本类型和实践(一)struct 结构体、文件引用 和 基本类型 - 掘金 (juejin.cn),介绍的还是挺详细的。
- 对于proto3,可以看官方文档Language Guide (proto3) | Protocol Buffers | Google Developers
Kitex
Kitex使用IDL文件初始化项目并自动生成一些代码,使用如下命令生成代码
kitex -service 服务名称 -module 模块名称 IDL文件路径/IDL文件名称.IDL文件后缀
生成的文件目录结构如下图所示:
其中handler.go文件包含了服务端的接口函数,需要我们填充相应的业务逻辑代码:
// Echo implements the HelloImpl interface.
func (s *HelloImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {
// TODO: Your code here...
resp = &api.Response{Message: req.Message}
return
}
然后我们需要在项目结构上新建一个client文件夹,新建main.go文件,然后编写客户端的代码,在这里使用服务端提供的服务:
func main() {
client, err := hello.NewClient("hello", client.WithHostPorts("0.0.0.0:8888"))
if err != nil {
log.Fatal(err)
}
for {
req := &api.Request{Message: "my request"}
resp, err := client.Echo(context.Background(), req)
if err != nil {
log.Fatal(err)
}
log.Println(resp)
time.Sleep(time.Second)
}
}