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

go-zero 实战(4)

中间件

在 userapi 项目中引入中间件。go项目中的中间可以处理请求之前和之后的逻辑。

1. 在 userapi/internal目录先创建 middlewares目录,并创建 user.go文件

package middlewaresimport ("github.com/zeromicro/go-zero/core/logx""net/http"
)type UserMiddleware struct {
}func NewUserMiddleware() *UserMiddleware {return &UserMiddleware{}
}func (*UserMiddleware) LoginAndReg(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {logx.Info("execute before login and register")next(w, r)logx.Info("execute after login and register")}
}

这里,就定义了一个中间件。

2. 在 userapi/internal/svc/servicecontext.go 文件中创建一个中间件实例

package svcimport ("github.com/zeromicro/go-zero/zrpc""rpc-common/userclient""userapi/internal/middlewares""userapi/internal/config"
)type ServiceContext struct {Config         config.ConfigUserRpc        userclient.UserUserMiddleware *middlewares.UserMiddleware // 定义中间件
}func NewServiceContext(c config.Config) *ServiceContext {return &ServiceContext{Config:         c,UserRpc:        userclient.NewUser(zrpc.MustNewClient(c.UserRpc)),UserMiddleware: middlewares.NewUserMiddleware(), // 创建中间件实例}
}

3. 修改 userapi/internal/handler/routers.go 文件

在这里插入图片描述
在这里引入了路由中间件。

4. 修改 userapi/internal/logic/userapilogic.go文件

在该文件中,修改 Login 方法,加入一行日志。为了后面测试用。

func (l *UserLogic) Login(t *types.LoginRequest) (string, error) {logx.Info("login executing....")  // 新加入的代码userId := 100auth := l.svcCtx.Config.Authreturn l.getToken(auth.AccessSecret, time.Now().Unix(), auth.AccessExpire, userId)
}

5. 测试中间件

在这里插入图片描述
访问 login 接口后,在控制台打印日志。日志是由路由中间件打印的。

6. 全局中间件

上面引入的路由中间件是,可以针对部分路由起作用,如果想要对所有路由起作用,可以使用全局中间件。
在 userapi/internal/handler/routers.go文中,加入一行代码:
在这里插入图片描述
这样引入的中间件,就是全局中间件,对所有路由都会生效。

自定义错误

1. 引出问题

  1. 在 userapi/internal/logic/userapilogic.go 文件的 GetUser 方法加一段逻辑
    在这里插入图片描述
  2. 测试
    在这里插入图片描述
    用postman 测试后,结果如图。显然,很多情况下,我们不想直接获取到这种形式的错误。更愿意拿到一个 json 格式的错误,包括错误代码,错误内容。这样更容易处理。

2. 在 userapi/internal 创建 errorx 目录,来管理错误

在 userapi/internal/errorx 目录创建一个 error.go 文件

package errorxvar ParamsError = New(1101, "parameter error")type BizError struct {Code int    `json:"code"`Msg  string `json:"msg"`
}func New(code int, msg string) *BizError {return &BizError{Code: code,Msg:  msg,}
}func (e *BizError) Error() string {return e.Msg
}type ErrorResponse struct {Code int    `json:"code"`Msg  string `json:"msg"`
}func (e *BizError) Data() *ErrorResponse {return &ErrorResponse{e.Code,e.Msg,}
}

该文件定义了错误码和错误内容。

3. 修改 userapi/internal/logic/userapilogic.go 文件

在这里插入图片描述
返回错误的时候,返回我们上一步自定义的错误。

4. 修改 userapi/userapi.go 文件,增加错误处理逻辑

在这里插入图片描述
增加了,错误处理的逻辑。

5. 测试

在这里插入图片描述
这样,就获取到 json 格式的错误数据。

goctl 命令

1. 源码文件生成格式

goctl api go -api userapi.api -dir ./gen 

这种方式生成的代码,文件名称是所有字母全小写。有时候我们需要不同的命名格式,比如有些团队或个人喜欢驼峰命名方式,有些喜欢snake的形式

goctl api go -api userapi.api -dir ./gen -style go_zero 

这种方式生成的文件名称是 snake 形式。

goctl api go -api userapi.api -dir ./gen -style goZero 

这种命名方式是驼峰命名方式

2. 生成 proto 文件

goctl rpc template -o=user.proto

利用模板生成 .proto 文件,这样在开发过程中,有一个基础模块。在这个目标上进行修改,相对更方便一点。

3. 生成 rpc 服务代码

goctl rpc protoc user.proto --go_out=. --go-grpc_out=. --zrpc_out=.

之前,我们项目的代码就是靠这种方式生成的。

4. 生成 model 代码

goctl model mysql ddl -src="./*.sql" =dir="./sql/model" -c

根据数据库的 ddl 语句,生成模型代码。生成的这部分代码,可以摘取部分使用,减少工作量。

5. 生成 dockerfile

goctl docker -go hello.go

hello.go 是启动类。

6. 生成 k8s 只要清单

goctl kube deploy -name redis -namespace adhoc -image redis:6-alpine -o redis.yaml -port 6379
http://www.lryc.cn/news/353715.html

相关文章:

  • go语言泛型Generic最佳实践 --- slices包
  • 【神经网络结构可视化】使用 Visualkeras 可视化 Keras / TensorFlow 神经网络结构
  • nvm安装nodejs/npm/nvm笔记
  • 微信小程序源码-基于Java后端的小区租拼车管理信息系统毕业设计(附源码+演示录像+LW)
  • 嵌入式进阶——LED呼吸灯(PWM)
  • 一文读懂:http免费升级https
  • 算法刷题笔记 高精度除法(C++实现)
  • 按月爬取天气数据可视化展示
  • VMware安装Ubuntu系统(超详细)
  • 数据清洗操作及众所周知【数据分析】
  • 炫酷gdb
  • windows 7 10 11快捷键到启动页面
  • [处理器芯片]-6 超标量CPU实现之浮点运算
  • 又有人叫嚣:AI取代前端,来给你几张图,看能不能憋死AI。
  • ISCC2024个人挑战赛WP-WEB
  • Android 使用 adb 列出设备上所有危险权限
  • Spring AOP源码分析
  • [LLM]从GPT-4o原理到下一代人机交互技术
  • 【Spring】AOP——通知(Advice)
  • python中的一些基础概念
  • 8.Redis之hash类型
  • Edge浏览器
  • springboot项目中图片上传之后需要重启工程才能看到图片?
  • 打卡信奥刷题(20)用Scratch图形化工具信奥B3756 [信息与未来 2021] 幸运数字
  • Stream流模式通信及示例
  • 从0开始学统计-t分布
  • Git总结超全版
  • 网络安全之安全协议浅谈
  • 华为云部署前端项目发生的事
  • 需求:实现一个可以统计代码的运行时间