这是我参与「第五届青训营 」伴学笔记创作活动的第6天。
0、重点
- Gorm(上一篇)
- Kitex
- Hertz(后续)
1、Kitex
Kitex是字节内部的Go语言微服务RPC框架,拥有高性能、强可扩展的主要特定,支持多协议并且拥有丰富的开源扩展。
参考文档:Kitex
1.1 安装Kitex
安装代码生成工具
首先,我们需要安装使用本示例所需要的命令行代码生成工具:
- 确保 GOPATH 环境变量已经被正确地定义(例如 export GOPATH=~/go)并且将$GOPATH/bin添加到 PATH 环境变量之中(例如 export PATH=$GOPATH/bin:$PATH);请勿将 GOPATH 设置为当前用户没有读写权限的目录
- 安装 kitex:go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
- 安装 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
上述代码中,echo.NewClient 用于创建 client,其第一个参数为调用的 服务名,第二个参数为 options,用于传入参数, 此处的 client.WithHostPorts 用于指定服务端的地址
发起调用
上述代码中,我们首先创建了一个请求 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 的服务端和客户端,并完成了一次调用!