CloudWeGo-Kitex教程二:创建项目
编写 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 的服务端和客户端,并完成了一次调用!