本文简单介绍了go-zero,以及go-zero相关的安装配置。通过go-zero的hello world级别的一个的单体应用和一个包含两个服务的微服务应用,以实践的方式展示了go-zero项目的入门级搭建。
文章目录
- 1. 简介
- 2. 快速开发单体应用
- 3. 微服务应用搭建
- 3.1 用户服务 user rpc
- 3.2 订单服务order api
- 3.3 启动项目
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 codeGitHub: https://github.com/zeromicro/go-zero
Site: https://go-zero.devUsage:goctl [command]Available Commands:api Generate api related filesbug Report a bugcompletion Generate the autocompletion script for the specified shelldocker Generate Dockerfileenv Check or edit goctl environmenthelp Help about any commandkube Generate kubernetes filesmigrate Migrate from tal-tech to zeromicromodel Generate model codequickstart quickly start a projectrpc Generate rpc codetemplate Template operationupgrade Upgrade goctl to latest versionFlags:-h, --help help for goctl-v, --version version for goctlUse "goctl [command] --help" for more information about a command.
架构图如下:
2. 快速开发单体应用
在上一节安装gRPC相关包的基础上
- 新建项目go_zero_demo
- go基础配置
go env -w GO111MODULE=ongo 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 hellocd hellogo mod tidygo run hello.go -f .\etc\hello-api.yaml
测试访问:http://localhost:8888/from/you
修改 /logic/hellologic.go
package logicimport ("context""go_zero_demo/hello/internal/svc""go_zero_demo/hello/internal/types""github.com/zeromicro/go-zero/core/logx"
)type HelloLogic struct {logx.Loggerctx context.ContextsvcCtx *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 linereturn &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\rpcgoctl 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/apicd order/api
- 添加api文件order.api
type(OrderReq {Id string `path:"id"`}OrderReply {Id string `json:"id"`Name string `json:"name"`}
)service order {@handler getOrderget /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