RPC框架Kitex初体验 | 青训营笔记

152 阅读1分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

今天的青训营课程介绍了Kitex这个RPC框架,下面就对课程中提及到的知识点做一个记录。

IDL

IDL(Interface Description Language)文件描述了服务端与客户端之间通信的约定,里面定义了请求和响应的信息格式,并声明了服务的接口格式(可以类比为函数的签名)。通俗来讲就是对于一个暴露的接口,应当描述清楚需要传什么参数以及接口返回的类型是怎样的。

IDL文件主要有Thrift IDLproto3 IDL两种格式:

  1. 对于Thrift IDL的语法,可以参考这篇文章thrift IDL 基本类型和实践(一)struct 结构体、文件引用 和 基本类型 - 掘金 (juejin.cn),介绍的还是挺详细的。
  2. 对于proto3,可以看官方文档Language Guide (proto3)  |  Protocol Buffers  |  Google Developers

Kitex

Kitex使用IDL文件初始化项目并自动生成一些代码,使用如下命令生成代码

kitex -service 服务名称 -module 模块名称 IDL文件路径/IDL文件名称.IDL文件后缀

生成的文件目录结构如下图所示:
image.png
其中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)
    }
}