go-zero 实战(4)

news2025/1/12 18:09:38

中间件

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

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

package middlewares

import (
	"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 svc

import (
	"github.com/zeromicro/go-zero/zrpc"
	"rpc-common/userclient"
	"userapi/internal/middlewares"

	"userapi/internal/config"
)

type ServiceContext struct {
	Config         config.Config
	UserRpc        userclient.User
	UserMiddleware *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 := 100
	auth := l.svcCtx.Config.Auth
	return 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 errorx

var 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.coloradmin.cn/o/1708652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

实战

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 实战一:输出“王者荣耀”的游戏角色 “王者荣耀”游戏中有很多英雄,这些英雄可以分为法师、战士、坦克、刺客、射手和辅助。…

Python---Matplotlib(2万字总结)【从入门到掌握】

数据可视化 在完成了对数据的透视之后,可以将数据透视的结果通过可视化的方式呈现出来,简单的说,就是将数据变成漂亮的图表,因为人类对颜色和形状会更加敏感,然后再进一步解读数据背后隐藏的价值。在之前的文章中已经…

OSPF优化——OSPF减少LSA更新量2

二、特殊区域——优化非骨干区域的LSA数量 不是骨干区域、不能存在虚链路 1、不能存在 ASBR 1)末梢区域 该区域将拒绝 4、5LSA的进人,同时由该区域连接骨干0区域的ABR 向该区域,发布一条3类的缺省路由; 该区域内每台路由器均需配置&#xf…

【华为OD机试-C卷D卷-200分】反射计数(C++/Java/Python)

【华为OD机试】-(A卷+B卷+C卷+D卷)-2024真题合集目录 【华为OD机试】-(C卷+D卷)-2024最新真题目录 题目描述 给定一个包含 0 和 1 的二维矩阵。 给定一个初始位置和速度,一个物体从给定的初始位置出发,在给定的速度下进行移动,遇到矩阵的边缘则发生镜面发射。 无论物体…

浙江大学数据结构MOOC-课后习题-第十讲-排序4 统计工龄

题目汇总 浙江大学数据结构MOOC-课后习题-拼题A-代码分享-2024 题目描述 测试点 思路分析 这道题很明显就是利用桶排序的思路 受到课程内容的影响,我一开始是想着建立一个链表数组,数组内每个元素下方都存放链表,最后再遍历统计输出。 但是&…

SMB工具横向移动

一. SMB工具介绍和使用 1.介绍 2013年的Defcon上,就引入了smbexec,后续 smbexec 被 Impacket 进一步完善了。在Impacket中支持明文认证,NTLM认证,Aeskey认证等方式! 2. 使用方法 命令: smbexec.exe 用户…

【Linux系统】进程间通信

本篇博客整理了进程间通信的方式管道、 system V IPC的原理,结合大量的系统调用接口,和代码示例,旨在让读者透过进程间通信去体会操作系统的设计思想和管理手段。 目录 一、进程间通信 二、管道 1.匿名管道 1.1-通信原理 1.2-系统调用 …

BLE蓝牙模块在车联网中的智能开锁、数据监控应用

随着科技的不断发展,车联网已经成为了汽车行业的一个热门话题。在这个领域中,BLE蓝牙模块发挥着重要的作用,特别是在智能开锁和数据监控方面的应用。本文将详细介绍BLE蓝牙模块在这两个方面的应用及其优势。   一、智能开锁   1.车辆远程…

懒人创业秘诀揭秘:加入萤瓴优选项目,普通人也能打开财富大门

创业对于很多人来说,是一个艰难而复杂的过程。然而,时代的发展带来了新的机遇,懒人创业成为了一种趋势。加入萤瓴优选项目,普通人也能轻松打开财富大门。本文将揭秘懒人创业的秘诀,并分析萤瓴优选项目如何帮助普通人实…

【MySQL事务(下)(重点)】

文章目录 再次理解MySQL事务一、MVCC机制数据库并发的场景有三种:3个记录隐藏列字段undo日志——由mysql维护的一段内存空间再次理解隔离性和隔离级别 Read View 理论部分RR 和 RC 的本质区别 再次理解MySQL事务 1.每个事务都有自己的事务ID,根据事务的…

盐城市大数据集团携手百望云 以MaaS推进数字经济跃迁

随着ChatGPT的爆火,大模型、人工智能、大数据等技术,被快速推向市场最前沿。如何通过创新技术提升企业的数字化能力,助力数据要素资产沉淀,推动企业及所在行业、区域实现数智化转型,是大家关注的核心问题。 “携手共建…

Linux shell命令

cat 文件名 查看文件内容, tac文件名 倒着显示。 more 文件名 显示内容 less文件名 和more的功能一样,按上下左右键,按Q键结束。 head文件名,只显示前10行内容。 ln是一个默认创建硬链接的命令 ln 文件名 ls -i文件名…

单元测试的实现方式

单元测试的实现方式包括:人工静态检查、动态执行跟踪 人工静态检查 人工静态检查是一种单元测试实现方式,它主要依赖开发人员的人工代码审查和静态分析工具来识别潜在的代码问题。 代码审查:开发人员通过仔细检查代码来发现潜在的问题。他…

IT人的拖延——渴望成功与害怕成功的矛盾

很多人都以为,害怕失败是拖延的主要诱因,但其实“害怕成功”也是拖延的主要诱因之一。要说这个原因,我们不得不提起Bible中的一个人“约拿”,让我们先来看看他的故事带给我们什么启示。 约拿情结简介 约拿是Bible中的一名先知&a…

[C][数组]详细讲解

目录 0.何为数组?1.一维数组1.创建2.数组的初始化3.一维数组的使用4.一维数组在内存中的存储 2.二维数组1.创建2.二维数组初始化3.二维数组的使用4.二维数组在内存中的存储 3.数组越界4.数组作为函数参数 0.何为数组? 数组是一组形同类型的元素int arr[…

数据结构的希尔排序(c语言版)

一.希尔排序的概念 1.希尔排序的基本思想 希尔排序是一种基于插入排序算法的优化排序方法。它的基本思想如下: 选择一个增量序列 t1&#xff0c;t2&#xff0c;......&#xff0c;tk&#xff0c;其中 ti > tj, 当 i < j&#xff0c;并且 tk 1。 按增量序列个数k&#…

快速复制成功模式:解读SaaS裂变工具的核心价值

在数字化快速发展的今天&#xff0c;企业如何在竞争激烈的市场中迅速站稳脚跟&#xff0c;成为许多企业家和管理者关注的焦点。SaaS裂变工具作为一种创新的解决方案&#xff0c;以其独特的优势&#xff0c;帮助企业快速复制成功模式&#xff0c;实现业务的快速增长。 SaaS裂变工…

GTD时间管理法

Part 1. What is GTD? | 什么是GTD&#xff1f; GTD is a framework that enhances focus and productivity. Through techniques such as capturing all tasks in a trusted system and breaking down complex projects into actionable items, GTD allows individuals to co…

组件的传参等

一:组件的生命周期函数 组件的生命周期函数: created只是创建了组件内的实例对象 attached,给组件实例绑定了属性,绑定到页面节点树之后 ready准备好渲染之后,还未渲染之前 moved组件实例被移动到另一个位置后执行 detached在整个组件被被移除执行 error执行的时候,组件内…

左偏树,可合并堆

合并两个堆并维护最小或最大性质解决树上节点问题&#xff0c;从叶节点往根维护&#xff0c;每个节点看作一个堆表示到最近的叶节点的距离&#xff0c;所以每次对合并&#xff08;树高矮&#xff09;表示堆的顶点对应下标关键代码 static void dfs(int x){for(int ihead[x];i&g…