go-zero单体服务实践

go-zero单体服务实践

最近想做一个微信小程序,会涉及到后端接口,那么选什么好呢?用Gin、Beego吗?最后思来想去,还是选择了go-zero,主要是因为它开发起来相对简单一些。

安装goctl

我的开发环境是Windows 10,那么先进入到powershell,先设置代理:

1
2
$env:GO111MODULE="on"
$env:GOPROXY = "https://goproxy.cn"

然后执行安装命令go install github.com/zeromicro/go-zero/tools/goctl@latest,安装完后,执行goctl便可看到如下命令提示

新建项目


我们跟着官网,创建所需项目,

1
mkdir wedding && cd wedding && go mod init wedding && goctl api new wedding && go mod tidy

至此,项目便初始化完成。

从数据生成模型

goctl命令直接可以连接数据库生成相应的表model,并生成简单的CRUD代码,官方的用法

1
goctl model mysql datasource -url="user:password@tcp(127.0.0.1:3306)/database" -table="*"  -dir="./model"

直接带上实际的环境参数即可生成

编写api文件,生成api代码

在项目初始化时,命令工具会为我们生成一个*.api的文件,同时,也会生成一个接口模版

我们安装这个模版进行编码

api文件编写好后,便可通过goctl生成代码了,

1
goctl api go -api wedding.api -dir .


关于api描述文件的语法格式,可以去go-zero官网了解一下,这里暂不赘述

编写业务逻辑

go-zero为我们生成好了基础代码,现在,我们只需要把这些代码稍作调整,将其组装起来便可使用了。

配置数据库连接

首先,我们去wedding-api.yaml配置数据库信息

然后到Config.go去配置连接属性

1
2
3
Mysql struct{
DataSource string
}


继续到servicecontext.go进行依赖关联


这里的model是*model.go里面的接口
接下来,就是去loginlogic.go完成具体的逻辑了,因为我这里只是一条简单的数据查询,不需要有过多的逻辑,但是,goctl默认生成的代码中,也无法满足我的要求,那么,便只有修改一下原有逻辑,或者重新写个查询方法,这里,我是另外写了一个查询方法

1
2
3
4
5
6
7
8
9
10
11
12
13
func (m *defaultWeddingInfoModel) FindFirst(ctx context.Context) (*WeddingInfo, error) {
query := fmt.Sprintf("select %s from %s limit 1", weddingInfoRows, m.table)
var resp WeddingInfo
err := m.conn.QueryRowCtx(ctx, &resp, query)
switch err {
case nil:
return &resp, nil
case sqlc.ErrNotFound:
return nil, ErrNotFound
default:
return nil, err
}
}

进入到logic文件夹里找到对应的实现业务逻辑的go文件,添加业务逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
func (l *WeddingInfoLogic) WeddingInfo() (resp *types.WeddingInfoResponse, err error) {
// todo: add your logic here and delete this line
weddingInfo, e := l.svcCtx.WeddingInfo.FindFirst(l.ctx)
if e != nil {
return nil, e
}

return &types.WeddingInfoResponse{
Lat: weddingInfo.Lat,
Lng: weddingInfo.Lng,
Address: weddingInfo.Address,
Hotel: weddingInfo.Hotel,
Man: weddingInfo.Man,
Woman: weddingInfo.Woman,
BgUrl: weddingInfo.BgUrl,
MusicUrl: weddingInfo.MusicUrl,
Date: weddingInfo.Date,
DateDesc: weddingInfo.DateDesc,
}, nil
}


取数逻辑简单的调整了一下,接下来便启动起来看看效果

访问一下接口,这里的接口路径可以到routes.go进行查看

上面是返回单条数据,我们再来模拟多条数据返回

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
photosmodel_gen.go
func (m *defaultPhotosModel) FindList(ctx context.Context) ([]Photos, error) {
query := fmt.Sprintf("select %s from %s ", photosRows, m.table)
var resp []Photos
err := m.conn.QueryRowsCtx(ctx, &resp, query)
switch err {
case nil:
return resp, nil
case sqlc.ErrNotFound:
return nil, ErrNotFound
default:
return nil, err
}
}

photologic.go
func (l *PhotoLogic) Photo() (resp []types.PhotoResponse, err error) {
// todo: add your logic here and delete this line
photos, e := l.svcCtx.Photo.FindList(l.ctx)
if e != nil {
return nil, e
}
response := make([]types.PhotoResponse, len(photos))
for index := 0; index < len(photos); index++ {
item := photos[index]
response[index] = types.PhotoResponse{
ImgUrl: item.ImgUrl,
}
}
return response, nil
}

作者

eyiadmin

发布于

2022-05-18

更新于

2024-05-31

许可协议

评论