Kitex 使用初体验

2,846 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

引言

本文为Kitex 使用初体验,在使用docker build的时候,因为依赖国外的库,遇到了网络问题,目前已解决,花了点时间,因此当作阅读记录一下。可以自己换镜像源或者科学上网来解决。

ERROR [2/8] RUN apk update && apk add git

ERROR: https://dl-cdn.alpinelinux.org/alpine/v3.14/main: Permission denied

image.png

Kitex中文文档

1. 准备 Golang 开发环境

  1. 如果您之前未搭建 Golang 开发环境, 可以参考 Golang 安装
  2. 推荐使用最新版本的 Golang,我们保证最新三个正式版本的兼容性(现在 >= v1.16)。
  3. 确保打开 go mod 支持 (Golang >= 1.15时,默认开启)
  4. kitex 暂时没有针对 Windows 做支持,如果本地开发环境是 Windows 建议使用 WSL2

2. 快速上手

在完成环境准备后,本章节将帮助你快速上手 Kitex

2.1 安装代码生成工具

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

  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
  1. 如果在安装阶段发生问题,可能主要是由于对 Golang 的不当使用造成,请依照报错信息进行检索

2.2 确定代码放置位置

  1. 若将代码放置于 $GOPATH/src 下,需在 $GOPATH/src 下创建额外目录,进入该目录后再获取代码:
mkdir -p $(go env GOPATH)/src/github.com/cloudwego
cd $(go env GOPATH)/src/github.com/cloudwego
  1. 若将代码放置于 GOPATH 之外,可直接获取

2.3 获取示例代码

  1. 你可以直接点击 此处 下载示例仓库
  2. 也可以克隆该示例仓库到本地 git clone https://github.com/cloudwego/kitex-examples.git

2.4运行示例代码

2.4.1 方式一:直接启动

  1. 进入示例仓库的 hello 目录

    cd kitex-examples/hello

  2. 运行 server

    go run .

  3. 运行 client

    另起一个终端后,go run ./client

2.4.2 方式二:使用 Docker 快速启动

  1. 进入示例仓库目录

    cd kitex-examples

  2. 编译项目

    docker build -t kitex-examples .

  3. 运行 server

    docker run --network host kitex-examples ./hello-server

image.png

  1. 运行 client

    另起一个终端后,docker run --network host kitex-examples ./hello-client

image.png

恭喜你,你现在成功通过 Kitex 发起了 RPC 调用。

2.5 增加一个新的方法

打开 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 的内容应该和上面一样。

2.6 重新生成代码

运行如下命令后,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 工具将更新下述文件

  1. 更新 ./handler.go,在里面增加一个 Add 方法的基本实现
  2. 更新 ./kitex_gen,里面有框架运行所必须的代码文件

2.7 更新服务端处理逻辑

上述步骤完成后,./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
}

2.8增加客户端调用

服务端已经有了 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)
}

2.9 重新运行示例代码

关闭之前运行的客户端和服务端之后

  1. 运行 server

go run .

  1. 运行 client

另起一个终端后,go run ./client

现在,你应该能看到客户端在调用 Add 方法了。

image.png