Kitex 快速开始
准备 Golang 开发环境
- 如果您之前未搭建 Golang 开发环境, 可以参考 Golang 安装
- 推荐使用最新版本的 Golang,我们保证最新三个正式版本的兼容性(现在 >= v1.16)。
- 确保打开 go mod 支持 (Golang >= 1.15时,默认开启)
- kitex 暂时没有针对 Windows 做支持,如果本地开发环境是 Windows 建议使用 WSL2
快速上手
在完成环境准备后,本章节将帮助你快速上手 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
4、如果在安装阶段发生问题,可能主要是由于对 Golang 的不当使用造成,请依照报错信息进行检索
确定代码放置位置
1、若将代码放置于 $GOPATH/src
下,需在 $GOPATH/src
下创建额外目录,进入该目录后再获取代码:
mkdir -p $(go env GOPATH)/src/github.com/cloudwego
cd $(go env GOPATH)/src/github.com/cloudwego
2、若将代码放置于 GOPATH 之外,可直接获取
获取示例代码
你可以直接点击 此处 下载示例仓库
也可以克隆该示例仓库到本地 git clone https://github.com/cloudwego/kitex-examples.git
运行示例代码
方式一:直接启动
- 进入示例仓库的 hello 目录
cd kitex-examples/hello
- 运行 server
go run .
- 运行 client
另起一个终端后,go run ./client
方式二:使用 Docker 快速启动
- 进入示例仓库目录
cd kitex-examples
- 编译项目
docker build -t kitex-examples .
- 运行 server
docker run --network host kitex-examples ./hello-server
- 运行 client
另起一个终端后,docker run --network host kitex-examples ./hello-client
恭喜你,你现在成功通过 Kitex 发起了 RPC 调用。
增加一个新的方法
打开 hello.thrift
,你会看到如下内容:
namespace go api
struct Request {
1: string message
}
struct Response {
1: string message
}
service Hello {
Response echo(1: Request req)
}
现在让我们为新方法分别定义一个新的请求和响应,AddRequest
和 AddResponse
,并在 service Hello
中增加 add
方法:
namespace go api
struct Request {
1: string message
}
struct Response {
1: string message
}
struct AddRequest {
1: i64 first
2: i64 second
}
struct AddResponse {
1: i64 sum
}
service Hello {
Response echo(1: Request req)
AddResponse add(1: AddRequest req)
}
完成之后 hello.thrift
的内容应该和上面一样。
重新生成代码
运行如下命令后,kitex
工具将根据 hello.thrift
更新代码文件。
kitex -service a.b.c hello.thrift
# 若当前目录不在 $GOPATH/src 下,需要加上 -module 参数,一般为 go.mod 下的名字
kitex -module "your_module_name" -service a.b.c hello.thrift
执行完上述命令后,kitex
工具将更新下述文件
- 更新
./handler.go
,在里面增加一个 Add
方法的基本实现 - 更新
./kitex_gen
,里面有框架运行所必须的代码文件
更新服务端处理逻辑
上述步骤完成后,./handler.go
中会自动补全一个 Add
方法的基本实现,类似如下代码:
// Add implements the HelloImpl interface.
func (s *HelloImpl) Add(ctx context.Context, req *api.AddRequest) (resp *api.AddResponse, err error) {
// TODO: Your code here...
return
}
让我们在里面增加我们所需要的逻辑,类似如下代码:
// Add implements the HelloImpl interface.
func (s *HelloImpl) Add(ctx context.Context, req *api.AddRequest) (resp *api.AddResponse, err error) {
// TODO: Your code here...
resp = &api.AddResponse{Sum: req.First + req.Second}
return
}
增加客户端调用
服务端已经有了 Add
方法的处理,现在让我们在客户端增加对 Add
方法的调用。
在 ./client/main.go
中你会看到类似如下的 for
循环:
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)
}
现在让我们在里面增加 Add
方法的调用:
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)
addReq := &api.AddRequest{First: 512, Second: 512}
addResp, err := client.Add(context.Background(), addReq)
if err != nil {
log.Fatal(err)
}
log.Println(addResp)
time.Sleep(time.Second)
}
重新运行示例代码
关闭之前运行的客户端和服务端之后
- 运行 server
go run .
- 运行 client
另起一个终端后,go run ./client
现在,你应该能看到客户端在调用 Add 方法了。