go zero入门

一、goctl安装

goctlgo-zero 的内置脚手架,可以一键生成代码、文档、部署 k8s yaml、dockerfile 等。

# Go 1.16 及以后版本
go install github.com/zeromicro/go-zero/tools/goctl@latest

检查是否安装成功

$ goctl -v
goctl version 1.6.6 darwin/amd64

vscode安装插件goctl

二、简单的http服务请求

2.1 通过goctl生成api项目

下面利用goctl实现一个单体服务,通过订单id获取订单信息(id、名称、价格)
order目录下

go mod init order
touch order.api

结构如下

    go-zero└── order├── go.mod└── order.api

order.api的代码

syntax = "v2"type (// 定义请求体OrderInfoReq {OrderId int64 'json:"order_id"' // 订单ID  }// 定义响应体OrderInfoResp {OrderId int64 'json:"order_id"' // 订单IDGoodsName string 'json:"goods_name"' // 商品名称Price int64 'json:"price"' // 商品价格}
)// 定义 HTTP 服务
// 微服务名称为 order-api
service order-api {// 标记了订单信息查询接口的文档注释。@doc(summary: "获取订单信息")// 指定处理该请求的处理器为orderInfo。@handler orderInfo// 定义接口// 请求方法是post,路径是/order/info,参数是OrderInfoReq,返回值是OrderInfoResppost /oder/info (OrderInfoReq) returns (OrderInfoResp)
}

在当前目录下执行

$ goctl api go -api *.api -dir ./  --style=goZero    
Done.// 下载所需要的依赖
$ go mod tidy

该指令的作用是使用 goctl 工具生成 Go 语言的 API 代码项目

  • api go: 指定生成 Go 语言的 API 代码。
  • -api *.api: 指定输入的 API 描述文件,*.api 表示所有的 .api 文件,可以生成多个 API。
  • -dir ./: 指定输出目录为当前目录 (./),生成的代码将会放置在当前目录中。
  • --style=goZero: 指定生成代码的风格为 goZero

当前目录生成的api项目结构如下

.
├── etc							// 配置文件
│   └── order-api.yaml
├── go.mod
├── internal
│   ├── config					// 配置对应的数据结构
│   │   └── config.go
│   ├── handler					// http部分的代码
│   │   ├── orderInfoHandler.go
│   │   └── routes.go
│   ├── logic					// 需要自己写的代码逻辑
│   │   └── orderInfoLogic.go
│   ├── svc						// 上下文相关依赖
│   │   └── serviceContext.go
│   └── types
│       └── types.go
├── order.api
└── order.go					// 启动代码

2.2 实现业务逻辑

根据路由追踪到OrderInfo方法,实现业务逻辑
在这里插入图片描述

func (l *OrderInfoLogic) OrderInfo(req *types.OrderInfoReq) (resp *types.OrderInfoResp, err error) {// todo: add your logic here and delete this lineresp  = &types.OrderInfoResp{OrderId: req.OrderId,GoodsName: "车",Price: 100000,}return resp, nil
}

2.3 执行

// 启动服务
$ go run order.go -f etc/order-api.yaml

etc/order-api.yaml文件定义了启动的端口号和ip

$ curl -X POST -H "Content-Type: application/json" http://localhost:8888/order/info -d '{"order_id":34}'{"order_id":34,"goods_name":"车","price":100000}%

三、集成Gorm

基于上面的基础,再增加一个功能:记录订单信息(id、名称、价格)到数据库

3.1 配置Gorm

etc/order-api.yaml文件中配置参数DataSourceName

Name: order-api
Host: 0.0.0.0
Port: 8888
DataSourceName: root:zxm123578@(127.0.0.1:3306)/MING_DB?charset=utf8

在这里插入图片描述
internal/config/config.go中添加DataSourceName

type Config struct {rest.RestConfDataSourceName string
}

3.2 启动Gorm支持

internal目录下新建模型文件models\models.go

package modelsimport ("gorm.io/gorm"
)type Order struct {gorm.ModelOrderId   int64   `gorm:"index:order_id"`GoodsName string  `gorm:"type:varchar(64)"`Price     float64 `gorm:"type:decimal(10,2);default:0"`
}

修改svc/servicecontext.go代码如下

package svcimport ("order/internal/config""order/internal/models""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/schema"
)type ServiceContext struct {Config config.Config// DbEngin 数据库引擎DbEngin *gorm.DB
}func NewServiceContext(c config.Config) *ServiceContext {// 启动Gorm支持db, err := gorm.Open(mysql.Open(c.DataSourceName), &gorm.Config{NamingStrategy: schema.NamingStrategy{TablePrefix:   "o_", // 表名前缀SingularTable: true, // 使用单数表名},})if err != nil {panic(err)}//自动同步更新表结构db.AutoMigrate(&models.Order{})return &ServiceContext{Config:  c,DbEngin: db,}
}

3.3 实现业务逻辑

logic/orderRecordLogic.go文件实现业务逻辑

func (l *OrderRecordLogic) OrderRecord(req *types.OrderRecordReq) (resp *types.OrderRecordResp, err error) {// todo: add your logic here and delete this lineorder := models.Order{GoodsName: req.GoodsName,Price:     float64(req.Price),OrderId:   req.OrderId,}result := l.svcCtx.DbEngin.Create(&order)return &types.OrderRecordResp{OrderId: order.OrderId,}, result.Error
}

3.4 执行

先启动mysql,再启动服务

// 启动服务
$ go run order.go -f etc/order-api.yaml
$ curl -X POST -H "Content-Type: application/json" http://localhost:8888/order/record -d '{"order_id":34,"goods_name":"手机","price":5000}'{"order_id":34}%

四、通过api调用rpc服务

上面例子的商品名称是写死的,下面通过调用商品的rpc服务来获取商品信息。

安装protoc
安装etcd

4.1 通过goctl生成rpc服务

在go-zero下新建目录goods

go mod init goods
touch goods.proto
    go-zero└── goods├── go.mod└── goods.proto└── order

goods.proto代码如下

syntax = "proto3";
package goods;
option go_package = "./goods";// 定义请求体
message GoodsRequest {int64 goods_id = 1;
}// 定义响应体
message GoodsResponse {int64 goods_id = 1;string goods_name = 2;double price = 3;
}service Goods {rpc GetGoods(GoodsRequest) returns (GoodsResponse);
}

在当前目录下使用goctl生成一个rpc项目

goctl rpc protoc *.proto --go_out=./types --go-grpc_out=./types --zrpc_out=.
.
├── etc
│   └── goods.yaml
├── go.mod
├── goods.go
├── goods.proto
├── goodsclient
│   └── goods.go
├── internal
│   ├── config
│   │   └── config.go
│   ├── logic
│   │   └── getgoodslogic.go
│   ├── server
│   │   └── goodsserver.go
│   └── svc
│       └── servicecontext.go
└── types└── goods├── goods.pb.go└── goods_grpc.pb.go

4.2 实现业务逻辑

logic/getgoodslogic.go中实现业务逻辑

func (l *GetGoodsLogic) GetGoods(in *goods.GoodsRequest) (*goods.GoodsResponse, error) {// todo: add your logic here and delete this lineresp := &goods.GoodsResponse{GoodsId: in.GoodsId,GoodsName: "乐高",Price: 500,}return resp, nil
}

4.3 api调用rpc服务

不管是rpc之间的互相调用,还是api调用rpc,我们都需要知道rpc的proto文件。本文通过go work来实现

$ go work init order
$ go work use goods

接下来需要对orderapi项目进行修改

1. 修改配置文件order/etc/order-api.yaml

Name: order-api
Host: 0.0.0.0
Port: 8888DataSourceName: root:zxm123578@(127.0.0.1:3306)/MING_DB?charset=utf8Etcd:Hosts:- 127.0.0.1:2379Key: goods.rpc

2. 修改order/internal/config/config.go文件

package configimport ("github.com/zeromicro/go-zero/rest""github.com/zeromicro/go-zero/zrpc"
)type Config struct {rest.RestConfDataSourceName string//定义rpc服务GoodsRpc zrpc.RpcClientConf
}

3. 修改order/internal/svc/serviceContext.go

package svcimport ("goods/goodsclient""order/internal/config""order/internal/models""github.com/zeromicro/go-zero/zrpc""gorm.io/driver/mysql""gorm.io/gorm""gorm.io/gorm/schema"
)type ServiceContext struct {Config config.Config// DbEngin 数据库引擎DbEngin *gorm.DB//定义rpc类型Goods goodsclient.Goods
}func NewServiceContext(c config.Config) *ServiceContext {// 启动Gorm支持db, err := gorm.Open(mysql.Open(c.DataSourceName), &gorm.Config{NamingStrategy: schema.NamingStrategy{TablePrefix:   "o_", // 表名前缀SingularTable: true, // 使用单数表名},})if err != nil {panic(err)}//自动同步更新表结构db.AutoMigrate(&models.Order{})return &ServiceContext{Config:  c,DbEngin: db,//引入gprc服务Goods: goodsclient.NewGoods(zrpc.MustNewClient(c.GoodsRpc)),}
}

4. 修改order/internal/logic/orderInfoLogic.go

func (l *OrderInfoLogic) OrderInfo(req *types.OrderInfoReq) (resp *types.OrderInfoResp, err error) {// todo: add your logic here and delete this linegoodRequest := new(goods.GoodsRequest)goodRequest.GoodsId = req.OrderIdgoodsInfo, err := l.svcCtx.Goods.GetGoods(l.ctx, goodRequest)if err != nil {return nil, err}resp = &types.OrderInfoResp{OrderId:   req.OrderId,GoodsName: goodsInfo.GoodsName,Price:     goodsInfo.Price,}return resp, nil
}

4.4 执行

依次启动mysqll、etcd 、rpc和api

$ mysql -u root -p
# goods目录下
$ etcd
# goods目录下
$ go run goods.go -f etc/goods.yaml
# order目录下
$ go run order.go -f etc/order.yaml

通过curl进行post请求,查看结果

$  curl -X POST -H "Content-Type: application/json" http://localhost:8888/order/info -d '{"order_id":34}' {"order_id":34,"goods_name":"乐高","price":500}%  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/370124.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过SDK使用百度智能云的图像生成模型SDXL

登录进入百度智能云控制台,在模型广场按照图像生成类别进行筛选,可以找到Stable-Diffusion-XL模型。点击Stable-Diffusion-XL模型的API文档后在弹出的新页面下拉可以找到SDK调用的说明。 import qianfandef sdxl(file: str, prompt: str, steps: int 2…

C语言_练习题

求最小公倍数 思路:假设两个数,5和7,那么最小至少也要7吧,所以先假定最小公倍数是两个数之间较大的,然后看7能不能同时整除5和7,不能就加1继续除 int GetLCM(int _num1, int _num2) {int max _num1>_n…

堆叠的作用

一、为什么要堆叠 传统的园区网络采用设备和链路冗余来保证高可靠性,但其链路利用率低、网络维护成本高,堆叠技术将多台交换机虚拟成一台交换机,达到简化网络部署和降低网络维护工作量的目的。 二、堆叠优势 1、提高可靠性 堆叠系统多台成…

25款404网页源码(下)

25款404网页源码(下) 13部分源码 14部分源码 15部分源码 16部分源码 17部分源码 18部分源码 19部分源码 20部分源码 21部分源码 22部分源码 23部分源码 24部分源码 25部分源码 领取完整源码下期更新 13 部分源码 .rail {position: absolute;width: 100%…

Node.js-path 模块

path 模块 path 模块提供了 操作路径 的功能,如下是几个较为常用的几个 API: 代码实例: const path require(path);//获取路径分隔符 console.log(path.sep);//拼接绝对路径 console.log(path.resolve(__dirname, test));//解析路径 let pa…

Docker搭建MySQL双主复制详细教程

在此之前需要提前安装好Docker和 Docker Compose 。 一、创建目录 首先创建一个本地数据挂载目录。 mkdir -p master1-data master2-data二、编写docker-compose.yml version: 3.7services:mysql-master1:image: mysql:5.7.36container_name: mysql-master1environment:MYSQL_…

mac|idea导入通义灵码插件

官方教程:通义灵码下载安装指南_智能编码助手_AI编程_云效(Apsara Devops)-阿里云帮助中心 下载插件: ⇩ TONGYI Lingma - JetBrains 结果如下: 选择apply、ok,会出现弹窗,点击登录 可以实现:生成单元测…

FRP反向隧道代理打CFS三层

目录 攻击机 查看服务端frps.ini配置文件 开启服务端frps 蚁剑打目标机 上传客户端frp到目标机 ​frpc.ini文件配置成 客户端打开代理frpc vps显示成功客户端frpc打开 访问成功192.168.22.22的第二层内网主机 省去前面漏洞利用的rce过程,直接蚁剑开搞隧道…

如何使用VScode创建和上传Arduino项目

Visual Studio Code (VS Code) 是一种非常流行的通用集成开发环境 (IDE)。IDE 是一种将文本编辑器、编程界面、调试视图和项目管理集成在一个地方的软件。这个开源项目由微软领导,可以在所有操作系统上运行。使 VS Cod…

深度解析Ubuntu版本升级:LTS版本升级指南

深度解析Ubuntu版本升级:Ubuntu版本生命周期及LTS版本升级指南 Ubuntu是全球最受欢迎的Linux发行版之一,其版本升级与维护策略直接影响了无数用户的开发和生产环境。Canonical公司为Ubuntu制定了明确的生命周期和发布节奏,使得社区、企业和开…

宿舍报修小程序的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,基础数据管理,论坛管理,故障上报管理,新闻信息管理,维修人员管理 微信端账号功能包括:系统首页,新闻信息…

C++ 视觉开发 六.特征值匹配

以图片识别匹配的案例来分析特征值检测与匹配方法。 目录 一.感知哈希算法(Perceptual Hash Algorithm) 二.特征值检测步骤 1.减小尺寸 2.简化色彩 3.计算像素点均值 4.构造感知哈希位信息 5.构造一维感知哈希值 三.实现程序 1.感知哈希值计算函数 2.计算距离函数 3…

CTF入门知识点

CTF知识点 md5函数 <?php$a 123;echo md5($a,true); ?> 括号中true显示输出二进制 替换成false显示输出十六进制绕过 ffifdyop 这个字符串被 md5 哈希了之后会变成 276f722736c95d99e921722cf9ed621c&#xff0c;这个字符串前几位刚好是 or 6 而 Mysql 刚好又会把 …

分支与循环

目录 1. if语句 1&#xff09;if 2) else 3&#xff09;分支中包含多条语句 4&#xff09;if嵌套 2.关系操作符 3.条件操作符 4.逻辑操作符&#xff1a;&& || ! 1) 逻辑取反运算符 !​编辑 2 与运算符​编辑 3) 或运算符​编辑 4) 闰年的判断 5) 短路 …

一行代码用git新建分支

1.在本地创建分支 dev git branch dev2.切换分支 git checkout devwebstorm操作如下&#xff1a; 3.推送新分支到远程 git push --set-upstream origin 分支名webstorm操作如下&#xff1a;提交代码的时候会自动推送到远程 4.到git上面可以看看刚刚推送的内容 dev多推送…

MacOS miniconda安装方法

打开macos “终端” 应用 执行命令 mkdir -p ~/miniconda3curl https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-latest-MacOSX-arm64.sh -o ~/miniconda3/miniconda.shbash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3rm -rf ~/miniconda3/mini…

Java项目:基于SSM框架实现的智慧城市实验室管理系统分前后台【ssm+B/S架构+源码+数据库+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的智慧城市实验室管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单…

golang与以太坊交互

文章目录 golang与以太坊交互什么是go-ethereum与节点交互前的准备使用golang与以太坊区块链交互查询账户的余额使用golang生成以太坊账户使用golang生成以太坊钱包使用golang在账户之间转移eth安装使用solc和abigen生成bin和abi文件生成go文件使用golang在测试网上部署智能合约…

RK3588 Android12实现UVC输出功能详解

首先需要在相关部分添加uvc的功能&#xff0c;这里参考一下&#xff1a;rockchip rk3588添加uvc及uvc,adb的复合设备_uvc.gs6-CSDN博客 setprop sys.usb.config none;setprop sys.usb.config uvc 或者setprop sys.usb.config none;setprop sys.usb.config uvc,adb 使rk3588 进…

一款强大且免费开源的多连接数据库管理工具

大家好&#xff0c;今天给大家分享一款免费开源的跨平台数据库管理工具DbGate。 DbGate是一款免费开源的跨平台数据库管理工具&#xff0c;支持多种数据库&#xff0c;包括MySQL、PostgreSQL、SQL Server、MongoDB、SQLite等。它可以在Windows、Linux、Mac操作系统上运行&#…