使用go-zero快速构建微服务
本文是对 使用go-zero快速构建微服务的亲手实践
编写API Gateway代码
1 | mkdir bookstore && cd bookstore |
mkdir api && goctl api -o api/bookstore.api
1 | syntax = "v1" |
cd api && goctl api go -api bookstore.api -dir .
1 | api |
go run bookstore.go -f etc/bookstore-api.yaml
启动API Gateway服务,默认侦听在8888端口
因为默认生成的api/etc/bookstore-api.yml
为:
1 | Name: bookstore-api |
按提示下载,再次运行:
1 | {"@timestamp":"2023-02-16T16:31:09.658+08:00","caller":"stat/usage.go:61","content":"CPU: 0m, MEMORY: Alloc=2.5Mi, TotalAlloc=2.5Mi, Sys=14.5Mi, NumGC=0","level":"stat"} |
会定时(默认一分钟)输出cpu,内存等的统计信息,可以通过
logx.DisableStat()
禁用 (可以做到自定义模板.tpl里)返回的是null,并不是预期的{"found":false,"price":0}
这是因为:
resp是一个指针,这样直接return会是nil,需要如下显式声明
重启服务,再次发起请求,这样的response就符合预期了~
目前只返回了个空值,接下来会在rpc服务里实现业务逻辑
可以修改internal/svc/servicecontext.go来传递服务依赖(如果需要,比如Config,Auth,后续用到的RPC等)
实现逻辑可以修改internal/logic下的对应文件(如果接口较多,可以在.api里定义不同的group,使用goctl生成代码时,会自动在logic下根据group名称创建不同的文件夹)
可以通过goctl生成各种客户端语言的api调用代码(供客户端同学使用;支持多种语言)
编写RPC代码
编写add rpc服务
切到bookstore目录下
mkdir -p rpc/add && cd rpc/add
goctl rpc template -o add.proto
修改后文件内容如下:
1 | syntax = "proto3"; |
goctl rpc protoc add.proto --go_out=./pb --go-grpc_out=./pb --zrpc_out=.
1 | rpc/add |
go run add.go -f etc/add.yaml
可运行该服务
默认每隔一分钟输出cpu和内存信息
1 | {"@timestamp":"2023-02-16T20:02:10.640+08:00","caller":"stat/usage.go:61","content":"CPU: 0m, MEMORY: Alloc=3.3Mi, TotalAlloc=6.2Mi, Sys=15.9Mi, NumGC=3","level":"stat"} |
编写check rpc服务
切到bookstore目录下
mkdir -p rpc/check && cd rpc/check
goctl rpc template -o check.proto
修改后文件内容如下:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18syntax = "proto3";
package check;
option go_package = "./pb";
message checkReq {
string book = 1;
}
message checkResp {
bool found = 1;
int64 price = 2;
}
service checker {
rpc check(checkReq) returns(checkResp);
}
goctl rpc protoc check.proto --go_out=./pb --go-grpc_out=./pb --zrpc_out=.
1 | rpc/check |
go run check.go -f etc/check.yaml
可运行该服务
修改etc/check.yaml的端口为8081(因为8080已经被add服务使用了)
再回去修改API Gateway代码,调用add/check rpc服务
api/etc/bookstore-api.yaml,增加如下内容
1 | Add: |
通过etcd自动去发现可用的add和check服务
修改api/internal/config/config.go如下,增加add&check服务依赖
修改api/internal/svc/servicecontext.go,如下:
通过ServiceContext在不同业务逻辑之间传递依赖
(问:怎么解决依赖注入问题)
修改api/internal/logic/addlogic.go里的Add方法,如下:
通过调用adder的Add方法实现添加图书到bookstore系统
修改api/internal/logic/checklogic.go里的Check方法,如下:
通过调用checker的Check方法实现从bookstore系统中查询图书的价格
定义数据库表结构,并生成CRUD+cache代码
bookstore下创建rpc/model目录
mkdir -p rpc/model
(不过一般习惯把这个model文件夹抽出来,和api,rpc在一层)
在rpc/model目录下编写创建book表的sql文件book.sql,如下:
1 | CREATE TABLE `book` |
进入mysql命令行,创建DB和table
1 | create database gozero; |
在rpc/model目录下执行如下命令生成CRUD+cache代码,-c表示使用redis cache
goctl model mysql ddl -c -src book.sql -dir .
修改add rpc和check rpc,调用crud+cache代码
修改rpc/add/etc/add.yaml和rpc/check/etc/check.yaml,均增加如下内容:
1 | DataSource: root:123456@@tcp(xxx.xxx.xx.xx:3306)/gozero |
可以使用多个redis作为cache,支持redis单点或者redis集群
修改rpc/add/internal/config.go和rpc/check/internal/config.go,如下:
修改rpc/add/internal/svc/servicecontext.go和rpc/check/internal/svc/servicecontext.go,如下:
修改rpc/add/internal/logic/addlogic.go,如下
修改rpc/check/internal/logic/checklogic.go,如下:
项目使用
需要先全部启动api服务所依赖的rpc服务。如果先启动api,则会报错:
error: context deadline exceeded, make sure rpc service "add.rpc" is already started
全部启动:
(后面可以 -f指定不同环境的xxx.yaml)
调用add api,新增图书
curl -i "http://localhost:8888/add?book=Bible&price=10"
此时看数据库,book表里新增了一行数据
调用check api,检查某本图书的价格
curl -i "http://localhost:8888/check?book=Bible"
重启check rpc,再次执行curl -i "http://localhost:8888/check?book=Bible"
原文作者: fliter
原文链接:
https://dashen.tech/2023/02/16/使用go-zero快速构建微服务/版权声明: 转载请注明出处