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

控制台输出:

相关推荐
美若黎明@6 分钟前
C# 路径操作
开发语言·c#
Dovir多多30 分钟前
渗透测试入门学习——php与mysql数据库连接、使用session完成简单的用户注册、登录
前端·数据库·后端·mysql·安全·html·php
难以触及的高度33 分钟前
source ~/.bash_profile有什么用
开发语言·bash
Flying_Fish_roe37 分钟前
Spring Boot-WebSocket相关问题
spring boot·后端·websocket
骆晨学长43 分钟前
基于springboot学生健康管理系统的设计与实现
java·开发语言·spring boot·后端·spring
骆晨学长44 分钟前
基于Springboot的医疗健康助手开题报告
java·spring boot·后端
我是小酒44 分钟前
掌握 Spring:从新手到高手的常见问题汇总
java·后端·spring·springboot
if时光重来1 小时前
springboot项目实现导出excel动态设置表头
spring boot·后端·excel
code.song1 小时前
校园社团|基于springBoot的校园社团信息管理系统设计与实现(附项目源码+论文+数据库)
数据库·spring boot·后端
白总Server1 小时前
php语言基本语法
开发语言·ide·后端·golang·rust·github·php