微服务框架 go-zero 的基本介绍
go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。
go-zero 中的 api,rpc,数据库等涉及的代码,都可以给我们一键生成,无需耗费我们什么精力
只需要在生成的代码中填入自己的配置以及逻辑即可。
go-zero 框架具有以下显著特点:
强大的工具支持:尽可能少的代码编写,通过 goctl 工具一键生成多端代码。
极简的接口:完全兼容 net/http,支持中间件,方便扩展。
高性能:面向故障编程,弹性设计,内建服务发现、负载均衡、限流、熔断、降载等微服务治理能力。
自动校验:API 参数自动校验,超时级联控制,自动缓存控制。
链路跟踪:统计报警等,稳定保障了疫情期间每天的流量洪峰。
go-zero官方架构图
go-zero 的环境搭建 go
项目安装前置工具:
- 安装 etcd 工具(下载,解压,即可运行):https://github.com/etcd-io/etcd/releases
- 安装 protoc 工具
go
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
- 安装 goctl 工具
go
go install github.com/zeromicro/go-zero/tools/goctl@latest
zero 的快速实战 rpc , api ,model 部分
环境安装完毕之后,我们就可以来进行实战了,刚才有说到 go-zero 是一个集成了各种工程实践的 web 和 rpc 框架,那么我们就可以来设计 web 部分的接口和 rpc 部分的接口
场景示例
例如有一个订单场景,我们需要查询某个租户的地址,另外在租户系统这边,需要添加租户
创建租户模块tenant目录
先来定义 rpc 接口步骤:
- 创建rpc目录
- 编写tenant.proto文件
提供两个 rpc 接口- getTenant 获取租户信息
- addTenant 添加租户
go
//tenant.proto文件
syntax = "proto3";
package tenant;
option go_package = "./tenant";
message TidReq {
string name = 1;
}
message TenantRsp {
// 租户名称
string id = 1;
// 租户名称
string name = 2;
// 用户地址
string addr = 3;
}
message addTenantReq {
// 租户名称
string name = 1;
// 用户地址
string addr = 2;
}
message addTenantRsp {
// 租户 id
string id = 1;
}
service Tenant {
rpc getTenant(TidReq) returns(TenantRsp);
rpc addTenant(addTenantReq) returns(addTenantRsp);
}
go
//使用 goctl 工具生成代码
protoc -I . --go_out=. --go-grpc_out=. rpc/tenant.proto
goctl rpc protoc rpc/tenant.proto --go_out=. --go-grpc_out=. --zrpc_out=.
这个时候,关于 rpc 自动生成的部分就完成了,生成的代码目录图:
定义 api 接口步骤:
- 创建api目录
- 编写tenant.api文件
go
//tenant.api文件
//定义一个 Get 方法,url 为 / api /order/get/:name 的 http 接口
type (
OrderReq {
Name string `path:"name"`
}
OrderReply {
Id string `json:"id"`
Name string `json:"name"`
Addr string `json:"addr"`
}
)
service order {
@handler getOrder
get /api/order/get/:name (OrderReq) returns (OrderReply)
}
go
//使用 goctl 工具生成代码
goctl api go -api tenant.api -dir .
这个时候,关于 web 部分自动生成的部分就完成了,生成的代码目录图:
数据库步骤:
- 创建 model 目录
go
//生成model文件
goctl model mongo --type Group --dir model
这个时候,关于 model 部分自动生成的部分就完成了,生成的代码目录图:
填充逻辑层和配置
- 修改 ymall/order/api/internal/config/config.go ,Config struct 中加上 rpc 的配置
TenantRpc zrpc.RpcClientConf - 修改 project/tenant/api/internal/svc/servicecontext.go ,加上 rpc 的上下文
TenantRpc tenant.Tenant
TenantRpc:tenant.NewTenant(zrpc.MustNewClient(c.TenantRpc)),
- 修改 mymall/tenant/api/internal/logic/getorderlogic.go ,对逻辑层加上咱们自定义的逻辑,调用 rpc 的接口获取租户信息
- 修改 mymall/tenant/rpc/etc/tenant.yaml ,加上数据源和数据表的配置
- 修改 mymall/tenant/rpc/internal/svc/servicecontext.go ,添加关于 mysql 的上下文
Model model.TenantInfoModel
Model:model.NewTenantInfoModel(sqlx.NewMysql(c.DataSource)),
效果验证
注意:运行之前需要先运行之前安装的etcd.exe
- 打开终端 1 操作 rpc:
go
go run tenant.go
- 同时打开终端 2 操作 api:
go
go run tenant.go