go-zero的快速实战(完整)

微服务框架 go-zero 的基本介绍

go-zero 是一个集成了各种工程实践的 web 和 rpc 框架。通过弹性设计保障了大并发服务端的稳定性,经受了充分的实战检验。

go-zero 中的 api,rpc,数据库等涉及的代码,都可以给我们一键生成,无需耗费我们什么精力

只需要在生成的代码中填入自己的配置以及逻辑即可。

go-zero 框架具有以下显著特点:

强大的工具支持:尽可能少的代码编写,通过 goctl 工具一键生成多端代码。

极简的接口:完全兼容 net/http,支持中间件,方便扩展。

高性能:面向故障编程,弹性设计,内建服务发现、负载均衡、限流、熔断、降载等微服务治理能力。

自动校验:API 参数自动校验,超时级联控制,自动缓存控制。

链路跟踪:统计报警等,稳定保障了疫情期间每天的流量洪峰。

go-zero官方架构图

go-zero 的环境搭建 go

项目安装前置工具:

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 接口步骤:

  1. 创建rpc目录
  2. 编写tenant.proto文件
    提供两个 rpc 接口
    1. getTenant 获取租户信息
    2. 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 接口步骤:

  1. 创建api目录
  2. 编写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 部分自动生成的部分就完成了,生成的代码目录图:

数据库步骤:

  1. 创建 model 目录
go 复制代码
//生成model文件
goctl model mongo --type Group --dir model

这个时候,关于 model 部分自动生成的部分就完成了,生成的代码目录图:

填充逻辑层和配置

  1. 修改 ymall/order/api/internal/config/config.go ,Config struct 中加上 rpc 的配置
    TenantRpc zrpc.RpcClientConf
  2. 修改 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

控制台输出:

相关推荐
hopetomorrow8 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
郑祎亦18 分钟前
Spring Boot 项目 myblog 整理
spring boot·后端·java-ee·maven·mybatis
小牛itbull18 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i26 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
闲暇部落29 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
本当迷ya30 分钟前
💖2025年不会Stream流被同事排挤了┭┮﹏┭┮(强烈建议实操)
后端·程序员
GIS瞧葩菜38 分钟前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming198743 分钟前
STL关联式容器之set
开发语言·c++
熬夜学编程的小王1 小时前
【C++篇】深度解析 C++ List 容器:底层设计与实现揭秘
开发语言·数据结构·c++·stl·list
GIS 数据栈1 小时前
每日一书 《基于ArcGIS的Python编程秘笈》
开发语言·python·arcgis