本文需要介绍 gotools 工具
需要使用的工具命令:gotools queue -h
需要使用的工具命令:gotools crontab -h
代码地址:github.com/wuyan94zl/gotools
队列
生成
执行:gotools queue --name register
目录
queue | |
|-- register | |
|-- register.go | |
|-- queue.go |
编写逻辑
修改:queue/register/register.go
package register | |
import ( | |
"context" | |
"encoding/json" | |
"fmt" | |
"github.com/hibiken/asynq" | |
"github.com/wuyan94zl/example-api/container" | |
"github.com/wuyan94zl/example-api/models/user" | |
"github.com/wuyan94zl/gotools/utils" | |
) | |
func Handle(ctx context.Context, t *asynq.Task) error { | |
params := Params{} | |
err := json.Unmarshal(t.Payload(), ¶ms) | |
if err != nil { | |
return err | |
} | |
Do(ctx, params) | |
return nil | |
} | |
const QueueKey = "key" // todo 自定义队列key | |
type Params struct { | |
// todo 自定义队列参数结构体 | |
Nickname string `json:"nickname"` | |
LoginID string `json:"login_id"` | |
Password string `json:"password"` | |
} | |
func Do(ctx context.Context, params Params) { | |
// todo 队列业务逻辑处理 | |
u := user.Users{ | |
Nickname: params.Nickname, | |
LoginID: params.LoginID, | |
Password: utils.Md5ByString(params.Password), | |
} | |
info, err := container.Instance().UserModel.Insert(ctx, &u) | |
fmt.Println(info, err) | |
} |
队列逻辑为:添加注册一个用户
定时任务
生成
执行:gotools crontab -n register
目录
crontab | |
|-- register | |
|-- cronjob.go | |
|-- crontab.go |
编写逻辑
修改:crontab/register/cronjob.go
package register | |
import ( | |
"fmt" | |
"github.com/wuyan94zl/example-api/queue" | |
"github.com/wuyan94zl/example-api/queue/register" | |
"time" | |
) | |
const Spec = "0 * * * * *" // todo 设置定时时间 秒 分 时 日 月 周 | |
func NewJob() *Job { | |
return &Job{} | |
} | |
type Job struct{} | |
func (j *Job) Run() { | |
// todo 定时处理逻辑 | |
params := register.Params{ | |
Nickname: fmt.Sprintf("无言%s", time.Now().Format("01021504")), | |
LoginID: fmt.Sprintf("login%s", time.Now().Format("01021504")), | |
Password: "123456", | |
} | |
queue.Add(register.QueueKey, params) | |
} |
逻辑为:每分钟向添加用户队列发送一个消息
启动队列和定时任务 (仅操作一次)
修改:main.go
package main | |
import ( | |
"fmt" | |
"github.com/gin-gonic/gin" | |
"github.com/wuyan94zl/example-api/config" | |
"github.com/wuyan94zl/example-api/container" | |
"github.com/wuyan94zl/example-api/crontab" | |
"github.com/wuyan94zl/example-api/queue" | |
"github.com/wuyan94zl/example-api/router" | |
"github.com/wuyan94zl/gotools/utils" | |
) | |
func main() { | |
c := new(config.Config) | |
utils.MustConfig("/config.yaml", c) | |
container.NewContainer(c.Container) | |
go queue.NewInstance(c.Container.Redis.Host, c.Container.Redis.Pass).Start() // 增加启动队列代码 | |
go crontab.NewInstance().Start() // 增加启动定时任务代码 | |
app := gin.Default() | |
group := app.Group("") | |
router.RegisterHandlers(group) | |
app.Run(fmt.Sprintf("%s:%d", c.Host, c.Port)) | |
} |
go-zero 启动
group := service.NewServiceGroup() | |
defer group.Stop() | |
group.Add(queue.NewInstance(host, pass)) // 增加启动队列代码 | |
group.Add(crontab.NewInstance()) // 增加启动定时任务代码 | |
group.Start() |
结束
执行:go mod tidy
&& go run main.go
验证是否每分钟会注册一个用户