GoZero入门使用及注意事项
1. 环境准备
1.1 Go语言安装
Windows安装(Go for Windows)[https://golang.org/dl/go1.15.8.windows-amd64.msi]
# 验证Go版本
go version
1.2 Go MODULE 配置
go env -w GO111MODULE="on"
开启Go MODULE之后就不需要配置GO PATH,代码在任何地方都可以运行
设置GOPROXY代理
go env -w GOPROXY=https://goproxy.cn
设置Go代理是因为我们要引用的大部分包都在国外,使用代理之后可以不翻墙就快速下载。
1.3 Goctl 安装
终端输入以下指令就可以
go install github.com/zeromicro/go-zero/tools/goctl@latest
Goctl 是gozero的核心之一,在使用时要通过goctl来进行框架代码的生成。要能够熟练使用。
2. API 配置
api配置控制着api服务中的各种功能,包含但不限于服务监听地址,端口,环境配置,日志配置等
这里配置可以先不管,一开始的配置够我们用。
3. 服务搭建
3.1 框架生成
首先新建一个文件夹,命名为项目名称,在文件夹中创建一个子文件夹,命名为api
,在api文件夹中创建一个api文件,这里用zhibo.api
示范
3.1.1 api文件
这里先定义一个getuserinfo 接口,首先在type中定义一个GetUserInfo接口,实现获取用户的信息功能。具体定义方法如下:
//api 语法版本
syntax = "v1"
//介绍
info(
author:"dsy"
date: "2023.03.20"
desc: "直播录制"
)
// 在type中定义GetUserInfo发送的Req 服务端返回的Reply格式,
//我这里请求使用的是form表单,具体字段是UserId ,
//返回的是用户的roomId 和WebId 后边的`json:""`表示这个字段在前端返回中的格式。
type (
GetUserInfoReq {
UserId string `form:"userid"`
}
GetUserInfoReply {
RoomData string `json:"room_id"`
WebId string `json:"web_id"`
}
)
3.1.2 生成代码框架
编写完api
文件后,在终端中使用如下命令,生成代码框架
# 对命令中的三个参数进行一个简单说明
goctl api go -api zhibo.api -dir ../ -style goZero
# -api 是指定你要使用的api文件
# -dir 指定要生成的目录,我这里是指定在项目的根目录下,就是api文件的上一个文件夹目录下,所以使用 ../
# -style 指定生成的代码格式, 在Go语言中,使用最多的格式就是驼峰式,我这里指定的也是驼峰式
在api文件夹中执行上述指令,就会生成代码框架,其代码结构如下,注释是一些功能解释。
$ tree zhibo
zhibo
├── api # 自己定义的api文件夹,里边放的是api文件,用来对接口进行定义。
│ └── zhibo.api
├── etc
│ └── zhibo-api.yaml # 自动生成的,写一些配置文件
├── zhibo.go # 启动函数接口
└── internal
├── config
│ └── config.go # 这个文件用来加载配置文件
├── handler
│ ├── zhibohandler.go # 自己生成的handler
│ └── routes.go
├── logic
│ └── zhibologic.go # 业务逻辑实现文件
├── svc
│ └── servicecontext.go # 定义一些上下文
└── types
└── types.go # 这里存放的是在api定义接口时定义的一些结构,可以在业务逻辑中直接使用
这里我们只需要关心logic
目录,可以在zhibologic.go
中开始写我们的接口。
3.1.3 业务逻辑实现
上边的框架生成的部分不需要我们关心,只需要在定义的方法那里写业务逻辑。
package logic
import (
"context"
"zhibo/internal/svc"
"zhibo/internal/types"
"github.com/zeromicro/go-zero/core/logx"
)
type InsertAccountLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewInsertAccountLogic(ctx context.Context, svcCtx *svc.ServiceContext) *InsertAccountLogic {
return &InsertAccountLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
func (l *GetUserInfoLogic) GetUserInfo(req *types.InsertAccountReq) (resp *types.InsertAccountReply, err error) {
//在这里写业务逻辑
return
}
🔥编写完业务逻辑后可以试着运行,下边是运行的步骤:
# 在运行时先进入入口函数所在的文件夹,这里就是项目的文件夹
# 先生成go mod,执行如下命令
go mod init 项目名(zhibo)
# 生成go mod 后进行包的同步,执行如下命令
go mod tidy
# 执行完上述命令就可以进行
go run zhibo.go
启动之后一个简单的接口就实现了,可以通过接口调试工具进行调试。
Starting server at 0.0.0.0:8888...
$ curl -i -X GET http://localhost:8888/from/you
4. 数据库配置
4.1 数据库连接
我使用的是官方提供的第二种model生成方式,先在mysql中建立数据表,然后使用goctl工具连接
- 创建数据库并建好数据表
- 新建一个
model
文件夹并进入 - 执行如下指令
# 这句指令中-url 用来指定数据库的连接地址
# -table 指定连接哪张表
# -c 是指使用带缓存的模式
# -dir 是指定文件生成的目录 . 是指当前目录
goctl model mysql datasource -url="$datasource" -table="user" -c -dir .
- 命令执行完后可以查看文件夹中的文件
$tree
.
├── user.sql
├── usermodel.go
├── usermodel_gen.go
└── vars.go
至此,数据库连接完成,接下来需要进行数据库的配置。
4.2 数据库配置
在数据库连接完成后要进行数据库的配置,主要是定义一些上下文,以便能够在业务逻辑中直接使用数据库。
4.2.1 config文件
package config
import "github.com/zeromicro/go-zero/rest"
type Config struct {
rest.RestConf
//加入DB
DB struct {
DataSource string
}
}
4.2.2 etc/zhibo.yaml 文件
# 添加这两行,指定数据库连接的地址
DB:
DataSource: root:password@tcp(localhost:3306)/live_recording
4.2.3 svc/servicecontext.go 文件
package svc
import (
"zhibo/internal/config"
"zhibo/model"
"github.com/zeromicro/go-zero/core/stores/sqlx"
)
type ServiceContext struct {
Config config.Config
//这行是我新添加的一张表,
UserModel model.LiveRecordingVideoModel
}
//配置数据库时,需要在这里添加 model
func NewServiceContext(c config.Config) *ServiceContext {
return &ServiceContext{
Config: c,
//同时这里也要新添加配置
UserModel: model.NewLiveRecordingVideoModel(sqlx.NewMysql(c.DB.DataSource)),
}
}
当上述配置都完成后,就可以在logic文件中,对数据表进行增删改查。下面是一个数据查询的逻辑。
package logic
import (
"context"
"errors"
"zhibo/internal/svc"
"zhibo/internal/types"
"zhibo/model"
"github.com/zeromicro/go-zero/core/logx"
)
type FineVideoLogic struct {
logx.Logger
ctx context.Context
svcCtx *svc.ServiceContext
}
func NewFineVideoLogic(ctx context.Context, svcCtx *svc.ServiceContext) *FineVideoLogic {
return &FineVideoLogic{
Logger: logx.WithContext(ctx),
ctx: ctx,
svcCtx: svcCtx,
}
}
//根据Id查询视频,如果存在则返回视频相关内容。
func (l *FindVideoLogic) FindVideo(req *types.FindVideoReq) (resp *types.FindVideoReply, err error) {
//这个FindVideo是一个方法,同时FindVideoLogic结构体关联了和数据库,只需要通过l调用gozero的封装,就可以实现查询。
VideoName,err := l.svcCtx.UserModel.FindOne(l.ctx,int64(req.Id))
if err != nil && err != model.ErrNotFound {
return nil,errors.New("数据查询失败")
}
if VideoName == nil {
return nil,errors.New("视频不存在")
}
return &types.FindVideoReply{
Path: VideoName.Path,
},err
}
到这里数据库的相关连接配置也就完成,可以关注业务逻辑的编写。