Go框架三件套详解(2):Kitex | 青训营笔记

352 阅读1分钟

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

0、重点

  • Gorm(上一篇)
  • Kitex
  • Hertz(后续)

1、Kitex

Kitex是字节内部的Go语言微服务RPC框架,拥有高性能、强可扩展的主要特定,支持多协议并且拥有丰富的开源扩展。

参考文档:Kitex

1.1 安装Kitex

安装代码生成工具

首先,我们需要安装使用本示例所需要的命令行代码生成工具:

  1. 确保 GOPATH 环境变量已经被正确地定义(例如 export GOPATH=~/go)并且将$GOPATH/bin添加到 PATH 环境变量之中(例如 export PATH=$GOPATH/bin:$PATH);请勿将 GOPATH 设置为当前用户没有读写权限的目录
  2. 安装 kitex:go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
  3. 安装 thriftgo:go install github.com/cloudwego/thriftgo@latest

安装成功后,执行 kitex --version 和 thriftgo --version 应该能够看到具体版本号的输出(版本号有差异,以 x.x.x 示例):

$ kitex --version
vx.x.x

$ thriftgo --version
thriftgo x.x.x

IDL

thrift通过一个中间语言IDL(接口定义语言)来定义RPC的数据类型和接口。

为什么要使用IDL?我们要进行RPC调用,就需要知道对方的接口是什么、需要传什么参数,同时也需要知道返回值是什么样的。这时候就需要通过IDL来约定双方的协议,就像在写代码的时候需要调用某个函数,需要知道函数前面一样。

使用thrift定义IDL需要创建一个文件以.thrift结尾,例如hello.thrift。

namespace go api

struct Request {
        1: string message
}
struct Response {
        1: string message
}
service Hello {
    Response echo(1: Request req)
}

定义好了IDL后,就可以使用kitex生成代码了。执行以下命令来生成项目代码:

kitex -module learning -service Hello hello.thrift

-module是模块名或者说是项目名

-service是服务名

生成后的项目结构如下:

.
|-- build.sh
|-- echo.thrift
|-- handler.go
|-- kitex_gen
|   `-- api
|       |-- echo
|       |   |-- client.go
|       |   |-- echo.go
|       |   |-- invoker.go
|       |   `-- server.go
|       |-- echo.go
|       `-- k-echo.go
|-- main.go
`-- script
    |-- bootstrap.sh
    `-- settings.py
  • build.sh 构建脚本,可以把代码变成可执行文件

  • kitex_gen IDL内容相关的生成代码,主要是基础的Server/Client代码

  • main.go 程序入口

  • handler.go 用户在该文件里实现IDLservice定义的方法

1.2 Kitex的基本使用

需要在handler.go实现Hello服务的echo方法,kitex默认监听8888端口。

Hello服务的代码实现,只需要在文件中的echo方法加入业务代码就可以了,复杂的代码逻辑的话可以按照MVC模式进行代码分层。

创建Client

image.png

上述代码中,echo.NewClient 用于创建 client,其第一个参数为调用的 服务名,第二个参数为 options,用于传入参数, 此处的 client.WithHostPorts 用于指定服务端的地址

发起调用

image.png

上述代码中,我们首先创建了一个请求 req , 然后通过 c.Echo 发起了调用。

其第一个参数为 context.Context,通过通常用其传递信息或者控制本次调用的一些行为,你可以在后续章节中找到如何使用它。

其第二个参数为本次调用的请求。

其第三个参数为本次调用的 options ,Kitex 提供了一种 callopt 机制,顾名思义——调用参数 ,有别于创建 client 时传入的参数,这里传入的参数仅对此次生效。 此处的 callopt.WithRPCTimeout 用于指定此次调用的超时(通常不需要指定,此处仅作演示之用)

1.3 发起调用

在编写完一个简单的客户端后,我们终于可以发起调用了。

可以通过下述命令来完成这一步骤:

$ go run main.go

如果不出意外,可以看到类似如下输出:

2021/05/20 16:51:35 Response({Message:my request})

至此就成功编写了一个 Kitex 的服务端和客户端,并完成了一次调用!

1.4 服务注册与发现

1.5 Kitex生态