本文简单介绍了go-zero,以及go-zero相关的安装配置。通过go-zero的hello world级别的一个的单体应用和一个包含两个服务的微服务应用,以实践的方式展示了go-zero项目的入门级搭建。
1. 简介
https://go-zero.dev/
go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。
go-zero 包含极简的 API定义和生成工具 goctl,可以根据定义的 api 文件一键生成 Go,ios,Android,Kotlin, Dart, TypeScript, JavaScript 代码,并可直接运行。
goctl -h
A cli tool to generate api, gRPC, model code
GitHub: https://github.com/zeromicro/go-zero
Site: https://go-zero.dev
Usage:
goctl [command]
Available Commands:
api Generate api related files
bug Report a bug
completion Generate the autocompletion script for the specified shell
docker Generate Dockerfile
env Check or edit goctl environment
help Help about any command
kube Generate kubernetes files
migrate Migrate from tal-tech to zeromicro
model Generate model code
quickstart quickly start a project
rpc Generate rpc code
template Template operation
upgrade Upgrade goctl to latest version
Flags:
-h, --help help for goctl
-v, --version version for goctl
Use "goctl [command] --help" for more information about a command.
架构图如下:
2. 快速开发单体应用
在上一节安装gRPC相关包的基础上
- 新建项目go_zero_demo
- go基础配置
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
检查配置
$ go env GO111MODULE
on
$ go env GOPROXY
https://goproxy.cn,direct
- 在项目目录通过下面命令安装
go get -u github.com/zeromicro/go-zero@latest
- 安装goctl、确保goctl可执行
go install github.com/zeromicro/go-zero/tools/goctl@latest
- 快速生成api服务
goctl api new hello
cd hello
go mod tidy
go run hello.go -f .\etc\hello-api.yaml
测试访问:http://localhost:8888/from/you
修改 /logic/hellologic.go
package logic
import (
"context"
"go_zero_demo/hello/internal/svc"
"go_zero_demo/hello/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type HelloLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewHelloLogic(ctx context.Context, svcCtx *svc.ServiceContext) *HelloLogic {
return &HelloLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *HelloLogic) Hello(req *types.Request) (resp *types.Response, err error) {
// todo: add your logic here and delete this line
return &types.Response{
Message: "hello, go-zero",
}, nil
}
3. 微服务应用搭建
假设我们在开发一个商城项目,而开发者小明负责用户模块(user)和订单模块(order)的开发,我们姑且将这两个模块拆分成两个微服务
演示功能目标
- 订单服务(order)提供一个查询接口
- 用户服务(user)提供一个方法供订单服务获取用户信息
根据情景提要我们可以得知,订单是直接面向用户,通过http协议访问数据,而订单内部需要获取用户的一些基础数据,既然我们的服务是采用微服务的架构设计,那么两个服务(user,order)就必须要进行数据交换,服务间的数据交换即服务间的通讯,到了这里,采用合理的通讯协议也是一个开发人员需要考虑的事情,可以通过http,rpc等方式来进行通讯,这里我们选择rpc来实现服务间的通讯,相信这里我已经对"rpc服务存在有什么作用?"已经作了一个比较好的场景描述。当然,一个服务开发前远不止这点设计分析,我们这里就不详细描述了。从上文得知,我们
需要一个
- user rpc
- order api
两个服务来初步实现这个小demo。
3.1 用户服务 user rpc
- 创建相应文件目录,创建proto文件并写入代码:
syntax = "proto3";
package template;
option go_package = "./user";
message IdRequest {
string id = 1;
}
message UserResponse {
string id = 1;
string name = 2;
string gender = 3;
}
service User {
rpc getUser(IdRequest) returns(UserResponse);
}
- 执行命令生成代码
cd mall\user\rpc
goctl rpc protoc user.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.
- 完善rpc服务端业务逻辑
这里提供给订单服务调用时返回用户id为1,名字是acezsq
3.2 订单服务order api
- 回到go_zero_demo/mall目录
- 创建order api服务目录
mkdir -p order/api
cd order/api
- 添加api文件order.api
type(
OrderReq {
Id string `path:"id"`
}
OrderReply {
Id string `json:"id"`
Name string `json:"name"`
}
)
service order {
@handler getOrder
get /api/order/get/:id (OrderReq) returns (OrderReply)
}
- 返回go_zero_demo\mall\order\api目录执行命令生成api服务代码
goctl api go -api order.api -dir .
- 配置etcd的服务发现
修改config文件
修改order.yaml文件,用于服务发现
- 将user用户服务的service添加到order订单服务
- 完善业务逻辑
oder服务通过rpc获取user用户信息,然后进行处理
3.3 启动项目
- 启动etcd
- 启动用户服务
进入user目录的user.go
go mod tidy
go run user.go -f etc/user.yaml
- 启动订单服务
进入订单目录的order.go
go run order.go -f etc/order.yaml
在浏览器中访问订单服务
完整的项目代码链接:https://github.com/acezsq/go_zero_demo