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

控制台输出:

相关推荐
Source.Liu5 分钟前
【用Rust写CAD】第二章 第四节 函数
开发语言·rust
monkey_meng5 分钟前
【Rust中的迭代器】
开发语言·后端·rust
余衫马8 分钟前
Rust-Trait 特征编程
开发语言·后端·rust
monkey_meng12 分钟前
【Rust中多线程同步机制】
开发语言·redis·后端·rust
Jacob程序员14 分钟前
java导出word文件(手绘)
java·开发语言·word
小白学大数据20 分钟前
正则表达式在Kotlin中的应用:提取图片链接
开发语言·python·selenium·正则表达式·kotlin
VBA633722 分钟前
VBA之Word应用第三章第三节:打开文档,并将文档分配给变量
开发语言
半盏茶香22 分钟前
【C语言】分支和循环详解(下)猜数字游戏
c语言·开发语言·c++·算法·游戏
落落鱼201335 分钟前
tp接口 入口文件 500 错误原因
java·开发语言
hlsd#38 分钟前
go 集成go-redis 缓存操作
redis·缓存·golang