CloudWeGo-Kitex教程二:创建项目

作者: adm 分类: go 发布时间: 2021-09-18

编写 IDL
首先我们需要编写一个 IDL,这里以 thrift IDL 为例。

首先创建一个名为 inzhong.thrift 的 thrift IDL 文件。

然后在里面定义我们的服务

namespace go api

struct Request {
1: string message
}

struct Response {
1: string message
}

service Inzhong{
Response echo(1: Request req)
}

生成 inzhong服务代码
有了 IDL 以后我们便可以通过 kitex 工具生成项目代码了,执行如下命令:

$ kitex -module inzhong -service order inzhong.thrift

上述命令中,-module 表示生成的该项目的 go module 名,-service 表明我们要生成一个服务端项目,后面紧跟的 order 为该服务的名字。最后一个参数则为该服务的 IDL 文件。

生成后的项目结构如下:

.
|-- build.sh
|-- conf
| `-- kitex.yml
|-- inzhong.thrift
|-- handler.go
|-- kitex_gen
| `-- api
| |-- inzhong
| | |-- client.go
| | |-- inzhong.go
| | |-- invoker.go
| | `-- server.go
| |-- inzhong.go
| `-- k-inzhong.go
|-- main.go
`-- script
|-- bootstrap.sh
`-- settings.py

获取最新的 Kitex 框架
由于 kitex 要求使用 go mod 进行依赖管理,所以我们要升级 kitex 框架会很容易,只需要执行以下命令即可:

$ go get github.com/cloudwego/kitex
$ go mod tidy

编写 echo 服务逻辑
我们需要编写的服务端逻辑都在 handler.go 这个文件中,现在这个文件应该如下所示:

package main

import (
"context"
"inzhong/kitex_gen/api"
)

// InzhongImpl implements the last service interface defined in the IDL.
type InzhongImpl struct{}

// Echo implements the InzhongImpl interface.
func (s *InzhongImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {
// TODO: Your code here...
return &api.Response{Message: req.Message}, nil
}

编译运行
kitex 工具已经帮我们生成好了编译和运行所需的脚本:

编译:

$ sh build.sh

执行上述命令后,会生成一个 output 目录,里面含有我们的编译产物。

运行:

$ sh output/bootstrap.sh

执行上述命令后,Echo 服务就开始运行啦!

编写客户端

有了服务端后,接下来就让我们编写一个客户端用于调用刚刚运行起来的服务端。

首先,同样的,先创建一个目录用于存放我们的客户端代码:

$ mkdir client

进入目录:

$ cd client

创建一个 main.go 文件,然后就开始编写客户端代码了。

创建 client
首先让我们创建一个调用所需的 client:

package main
import (
"context"
"github.com/cloudwego/kitex/client"
"inzhong/kitex_gen/api"
"inzhong/kitex_gen/api/inzhong"
"log"
"time"
)
func main() {
client, err := inzhong.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)

}
}

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

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

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

其第三个参数为本次调用的 options ,Kitex 提供了一种 callopt 机制,顾名思义——调用参数 ,有别于创建 client 时传入的参数,这里传入的参数仅对此次生效。
此处的 callopt.WithRPCTimeout 用于指定此次调用的超时(通常不需要指定,此处仅作演示之用)同样的,你可以在 *** 基础特性*** 一节中找到更多的参数。

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

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

$ go run main.go

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

2021/09/18 15:51:35 Response({Message:my request})

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

 

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!