当前位置: 首页 > news >正文

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

在这里插入图片描述

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

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

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

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

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

强大的工具支持:尽可能少的代码编写,通过 goctl 工具一键生成多端代码。
极简的接口:完全兼容 net/http,支持中间件,方便扩展。
高性能:面向故障编程,弹性设计,内建服务发现、负载均衡、限流、熔断、降载等微服务治理能力。
自动校验:API 参数自动校验,超时级联控制,自动缓存控制。
链路跟踪:统计报警等,稳定保障了疫情期间每天的流量洪峰。

go-zero官方架构图

在这里插入图片描述

go-zero 的环境搭建 go

项目安装前置工具:

  • 安装 etcd 工具(下载,解压,即可运行):https://github.com/etcd-io/etcd/releases
    在这里插入图片描述
  • 安装 protoc 工具
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 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 添加租户
//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 {// 租户 idstring id = 1;
}service Tenant {rpc getTenant(TidReq) returns(TenantRsp);rpc addTenant(addTenantReq) returns(addTenantRsp);
}
//使用 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文件
//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 getOrderget /api/order/get/:name (OrderReq) returns (OrderReply)
}
//使用 goctl 工具生成代码
goctl api go -api tenant.api  -dir .

这个时候,关于 web 部分自动生成的部分就完成了,生成的代码目录图:
在这里插入图片描述

数据库步骤:

  1. 创建 model 目录
//生成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 run tenant.go
  • 同时打开终端 2 操作 api:
go run tenant.go

控制台输出:

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基础 Web 开发
  • R134a制冷剂简介
  • clickhouse适用的业务场景
  • 编写XBOX控制器实现鼠标键盘输入
  • 数学建模笔记—— 回归分析
  • MultiSnapRecyclerView:让Android RecyclerView的滚动停靠更灵活
  • oracle 用游标为什么会比for循环慢?
  • 开始一个WPF项目时的记忆重载入
  • [创业之路-148] :ToC与ToB产品研发的比较
  • git解决同时编辑一个文件的冲突
  • MySQL数据的增删改查(一)
  • CGAL and the Boost Graph Library
  • 就服务器而言,ARM架构与X86架构有什么区别?各自的优势在哪里?
  • oracle select字段有子查询会每次执行子查询吗
  • Linux编译内核选项说明
  • 【跃迁之路】【641天】程序员高效学习方法论探索系列(实验阶段398-2018.11.14)...
  • 230. Kth Smallest Element in a BST
  • git 常用命令
  • happypack两次报错的问题
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • Java精华积累:初学者都应该搞懂的问题
  • jquery cookie
  • JS 面试题总结
  • Laravel Mix运行时关于es2015报错解决方案
  • Mybatis初体验
  • Vue2.0 实现互斥
  • vue总结
  • 从零开始的无人驾驶 1
  • 多线程事务回滚
  • 简单基于spring的redis配置(单机和集群模式)
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 力扣(LeetCode)965
  • 那些被忽略的 JavaScript 数组方法细节
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • ​【已解决】npm install​卡主不动的情况
  • ​插件化DPI在商用WIFI中的价值
  • #Linux(Source Insight安装及工程建立)
  • $(function(){})与(function($){....})(jQuery)的区别
  • $.proxy和$.extend
  • (1) caustics\
  • (152)时序收敛--->(02)时序收敛二
  • (175)FPGA门控时钟技术
  • (NSDate) 时间 (time )比较
  • (二)什么是Vite——Vite 和 Webpack 区别(冷启动)
  • (实战篇)如何缓存数据
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 设计一套高性能的弱事件机制
  • .net 生成二级域名
  • .NetCore发布到IIS
  • .NET的微型Web框架 Nancy
  • .secret勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复
  • /proc/vmstat 详解
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @Import注解详解
  • @JsonFormat 和 @DateTimeFormat 的区别