题图来自 Pixabay
我是游戏耀西。
由于工作需要,近期在学习字节跳动的微服务框架 Kitex。
在看了官方文档之后,觉得还缺少一些实践文档,于是将自己实践和踩坑的过程记录下来,以备后续回顾,并分享给有需要的朋友们。
好了,开始今天的篇章 —— 开发环境搭建与创建服务。
全文阅读大约需要 5 分钟。
一、开发环境搭建
1. 启动 docker container
由于我习惯在docker上做服务,就在docker上创建了一个名为 "debian-go-kitex" 的容器,用来作为我们后续学习的场地。
docker run -itd --name debian-go-kitex -p 8888:8888 6a3d7aa19f9c3910ba8fed40b31f0390be201e026753d639ebbfd992fbeb9791 /bin/bash
运行这条命令,就可以顺利地启动一个 debian 容器。
2. VSCode远程环境准备
在 VSCode 上搜索插件 Remote Development,安装下图所示的插件。
安装完毕后,左侧会出现一个 "远程资源管理器" 图标,点击选中已开启的 docker 容器,并将其附加到当前VSCode上。
3. VSCode 终端中运行以下命令行,安装Go环境
安装 Go 环境,只需要运行以下命令行。
wget https://go.dev/dl/go1.20.6.linux-amd64.tar.gz
rm -rf /usr/local/go && tar -C /usr/local -xzf go1.20.6.linux-amd64.tar.gz
# 这一行放在~/.bashrc中,然后source一下以图方便
export PATH=$PATH:/usr/local/go/bin:/root/go/bin
go version
# 创建src目录,以后工程代码就放这里了
mkdir -p $(go env GOPATH)/src
4. 安装 kitex 和 thriftgo
go install github.com/cloudwego/kitex/tool/cmd/kitex@latest
kitex --version
go install github.com/cloudwego/thriftgo@latest
thriftgo --version
5. 创建服务的工程目录
cd $(go env GOPATH)/src
mkdir example-server
cd example-server
至此开发环境搭建完毕。齐活儿,接下来编写服务。
二、 创建服务
请记住,kitex 的微服务是从一个 IDL 文件开始的,这个 IDL 在本文是一个 thrift 文件 —— echo.thrift。
1. 编写kitex微服务的起源 thrift 文件
namespace go api
struct Request {
1: string message
}
struct Response {
1: string message
}
service Echo {
Response echo(1: Request req)
}
这一步中的 thrift 文件定义了整个 rpc 服务的请求和返回结构,它是整个服务的源起。
2. 由 thrift 文件生成微服务 Go 代码
kitex -module example -service example-server echo.thrift
go mod tidy
这里有几个命令行中的可变量,需要说明一下:
thrift 文件首行 namespace go api,其中 api 会影响到 kitex_gen 目录中的文件的 package 名称,这个目录中都是生成的代码。
生成微服务代码中的 example 会影响到 go.mod 的 module 值,也就是整个工程的 module,比上面api这一层更高。
example-server 会影响到编译生成的可执行文件名。
这一步结束之后,我们就生成了一个叫 Echo 的服务。
整个服务目前只需要补齐工程目录下 handler.go 中的逻辑,就可以完成服务的编写。
三、 补全服务逻辑
在 handler.go 中,我们可以看到有一部分注释是这样的:
// TODO: Your code here...
在此补充自己的逻辑,例如补充:
func (s *EchoImpl) Echo(ctx context.Context, req *api.Request) (resp *api.Response, err error) {
return &api.Response{Message: "给你的信息: " + req.Message}, nil
}
服务已经补全,编译运行一下。
sh build.sh
sh output/bootstrap.sh
上面的 build.sh 是在 thrfit 文件生成服务代码时一并生成的,我们可以使用它非常方便地进行服务代码的编译。
编译的结果会放在 output/ 目录下,bootstrap.sh 就是我们运行服务的 shell 脚本。
四、 写个对应的 client 调用代码
在工程目录下,创建一个 client 目录,并在其中创建 main.go 文件,作为 client 代码。
package main
import (
"context"
"example/kitex_gen/api"
"example/kitex_gen/api/echo"
"log"
"time"
"github.com/cloudwego/kitex/client"
"github.com/cloudwego/kitex/client/callopt"
)
func main() {
// 创建连接
c, err := echo.NewClient("example-server", client.WithHostPorts("0.0.0.0:8888"))
if err != nil {
log.Fatal(err)
}
// 发起调用
req := &api.Request{Message: "这里是游戏耀西的频道,喜欢就关注追更哦"}
resp, err := c.Echo(context.Background(), req, callopt.WithRPCTimeout(3*time.Second))
if err != nil {
log.Fatal(err)
}
// 输出返回
log.Println(resp.Message)
}
运行客户端代码。
go run ./client
运行结果:
root@localhost:~/go/src/example-server# go run ./client/
2023/07/25 02:39:34 给你的信息: 这里是游戏耀西的频道,喜欢就关注追更哦
总结
本文对如何开始你的 Kitex 开发之旅进行了以下讲述:
- 开发环境搭建
- 创建服务
- 补全服务逻辑
- 写个对应的 client 调用代码
通过这些内容,能够帮助一个初始接触 kitex 微服务框架的开发者,能够快速上手,编写后续的服务。
本帐号 游戏耀西 将持续分享 Kitex 和微服务开发等干货,感谢你的阅读。