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. 引出问题
- 在 userapi/internal/logic/userapilogic.go 文件的 GetUser 方法加一段逻辑

- 测试

用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
相关文章:
go-zero 实战(4)
中间件 在 userapi 项目中引入中间件。go项目中的中间可以处理请求之前和之后的逻辑。 1. 在 userapi/internal目录先创建 middlewares目录,并创建 user.go文件 package middlewaresimport ("github.com/zeromicro/go-zero/core/logx""net/http&q…...
go语言泛型Generic最佳实践 --- slices包
在go的内置包slices中, 所有的函数函数都使用了泛型, 各种各样的泛型, 可以说这个包绝对是go语言泛型学习的最佳实践之一! 来,先来瞄一眼,看看这个slices包里面的函数原型定义: func BinarySe…...
【神经网络结构可视化】使用 Visualkeras 可视化 Keras / TensorFlow 神经网络结构
文章目录 Visualkeras介绍下载安装代码示例1、导入必要的库2、创建VGG16神经网络模型3、可视化神经网络结构4、完整代码5、使用教程 可视化自己创建的神经网络结构1、导入要的库2、创建自己的神经网络模型3、可视化神经网络结构图4、完整代码 Visualkeras介绍 Visualkeras是一…...
nvm安装nodejs/npm/nvm笔记
1 安装nvm, 指定路径nvm路径: D:\Program_Files\nvm\nvm指定路径nodejs 路径: D:\Program_Files\nvm\nodejs 2 进入nvm安装路径找到settings.xml文件,追加2行,设置镜像 node_mirror: https://npmmirror.com/mirrors/node/ npm_mirror: ht…...
微信小程序源码-基于Java后端的小区租拼车管理信息系统毕业设计(附源码+演示录像+LW)
大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设…...
嵌入式进阶——LED呼吸灯(PWM)
🎬 秋野酱:《个人主页》 🔥 个人专栏:《Java专栏》《Python专栏》 ⛺️心若有所向往,何惧道阻且长 文章目录 PWM基础概念STC8H芯片PWMA应用PWM配置详解占空比 PWM基础概念 PWM全称是脉宽调制(Pulse Width Modulation)…...
一文读懂:http免费升级https
背景: 随着现在全民网络安全意识的日益提升,各个网站需要实现的https数量也随之提升,那么如何将原本网站的http访问方式升级为https呢? 该内容为如何免费将网站的http访问升级为https访问 论https的加密逻辑: 步骤 …...
算法刷题笔记 高精度除法(C++实现)
文章目录 题目描述求解思路实现代码 题目描述 给定两个非负整数(不含前导0)A,B,请你计算 A/B 的商和余数。 输入格式 共两行,第一行包含整数A,第二行包含整数B。 输出格式 共两行,第一行输…...
按月爬取天气数据可视化展示
从天气网分析,可以查询每个月的天气情况,这里按照url规则,传入年月,获取数据,最后进行可视化展示,最终效果: 下面是获取过程: 第一步: import requestsdef get_weather(month):url = f"https://lishi.tianqi.com/nanning/{month}.html"response = reques…...
VMware安装Ubuntu系统(超详细)
一.Ubuntu官网下载镜像 Ubuntu官网:Enterprise Open Source and Linux | Ubuntu 二.安装Ubuntu系统 选择文件->创建虚拟机新建虚拟机(ControlN),这里直接选择典型即可 选择稍后安装系统 选择linux Ubuntu 64位 填写虚拟机名称…...
数据清洗操作及众所周知【数据分析】
各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 前面的博客 数据分析—技术栈和开发环境搭建 …...
炫酷gdb
在VS里面调试很方便对吧?(F5直接调试,F10逐过程调试--不进函数,F11逐语句调试--进函数,F9创建断点),那在Linux中怎么调试呢? 我们需要用到一个工具:gdb 我们知道VS中程…...
windows 7 10 11快捷键到启动页面
1.快速打开用户启动文件夹 shell:startup 方式2:快速打开系统启动文件夹 shell:Common Startup shell:Common Startup...
[处理器芯片]-6 超标量CPU实现之浮点运算
1 浮点运算单元FPU 超标量CPU中的浮点运算单元是专门处理浮点数运算的关键组件。浮点运算单元的设计涉及多个复杂的子模块和技术,以保证高效、准确地执行浮点数的加减法、乘法、除法、平方根等操作。 1)浮点数术语 浮点数通常采用IEEE 754标准表示&…...
又有人叫嚣:AI取代前端,来给你几张图,看能不能憋死AI。
总有自媒体人,为了些许流量,在大放厥词,说截个图给AI,AI就能输出前端代码,这是啥都敢说,吹牛不上税。 我来给你几张贝格前端工场日常接的大数据项目相关的图,你让AI生成代码,取代前…...
ISCC2024个人挑战赛WP-WEB
(非官方解,以下内容均互联网收集的信息和个人思路,仅供学习参考) 还没想好名字的塔防游戏 GET /world.js HTTP/1.1 Host: 101.200.138.180:17345 Accept: text/html,application/xhtmlxml,application/xml;q0.9,image/avif,i…...
Android 使用 adb 列出设备上所有危险权限
步骤1:确定 Android SDK 位置 打开 Android Studio 的设置,并来到 Languages & Frameworks › Android SDK 处: 这里可以看到 Android SDK 目录的位置: 例如:/Users/admin/Library/Android/sdk。 复制这个路径&am…...
Spring AOP源码分析
#### AOP(面向切面编程)作用及其优势 作用:在程序运行期间,在不修改源码的情况下对方法进行功能增强(通知) 优势:减少重复代码,提高代码复用性,提高代码可维护性…...
[LLM]从GPT-4o原理到下一代人机交互技术
一 定义 GPT-4o作为OpenAI推出的一款多模态大型语言模型,代表了这一交互技术的重要发展方向。 GPT-4o是OpenAI推出的最新旗舰级人工智能模型,它是GPT系列的一个重要升级,其中的"o"代表"Omni",中文意思是“全…...
【Spring】AOP——通知(Advice)
1、通知(Advice) 1.1简介 在AOP中,通知(Advice)是切面(Aspect)中的一部分,用于定义在连接点(Joinpoint)处应该执行的操作。通知类型可以在AOP框架中配置和使…...
高效直链文件分享平台深度评测(二)
1. 为什么你需要一个高效直链文件分享平台? 在日常工作和学习中,我们经常需要快速分享文件给同事、朋友或客户。传统的网盘虽然功能丰富,但往往需要对方注册账号、下载客户端,甚至忍受漫长的广告等待时间。而直链文件分享平台则提…...
用74LS160D和190D芯片搭建交通灯控制器:一个数电课设的完整实现与调试心得
74LS160D与190D芯片实战:从零构建交通灯控制器的深度解析 当数字电路课设遇上经典74系列芯片,一场关于时序逻辑与硬件调试的思维碰撞就此展开。交通灯控制系统作为数电课程的经典项目,看似简单的红绿灯交替背后,隐藏着计数器、译码…...
想转AI大模型开发?小白必看收藏:入门学习清单与实战技巧全解析!
本文为想进入AI大模型开发领域的小白或程序员提供实用建议,包括:避免裸辞,先试水学习;将数开经验转化为竞争优势;接受新手期,积累经验;不被高深名词PUA,先落地再优化。文章还提供了A…...
西门子PLC1500大型程序:包含Fanuc机器人汽车焊装与多种智能通讯系统
西门子PLC1500大型程序fanuc机器人汽车焊装 包括1台西门子1500PLC程序,2台触摸屏TP1500程序 9个智能远程终端ET200SP Profinet连接 15个Festo智能模块Profinet通讯 10台Fanuc发那科机器人Profinet通讯 3台G120变频器Profinet通讯 2台智能电能管理仪表PAC3200 4个GR…...
物联网养殖环控系统:科技赋能,推动传统养殖向数字转型
一、方案概述 物联网养殖环控系统,依托物联网、传感器、大数据、无线通信等核心技术,针对畜禽、水产等各类养殖场景,构建“感知-传输-分析-控制-管理”全链路智能闭环,实现养殖环境多参数实时监测、自动精准调控、远程便捷管理&am…...
3分钟解放双手:Midscene让AI帮你完成所有浏览器重复操作
3分钟解放双手:Midscene让AI帮你完成所有浏览器重复操作 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 厌倦了每天在浏览器中重复点击、填写、刷新&…...
5个内容访问解决方案:突破数字阅读限制的非技术人员实践指南
5个内容访问解决方案:突破数字阅读限制的非技术人员实践指南 在信息爆炸的时代,优质内容往往被付费墙阻隔,成为知识获取的障碍。本文将系统解析内容访问限制的技术原理,对比5种主流内容访问解决方案的适用场景与实施难度ÿ…...
制造业设计团队文档管理选型实战
制造业设计团队文档管理选型实战 某中型机械制造企业,研发团队47人,日常需要管理CAD图纸、BOM表、工艺文件、技术规范等超过120万份文件。过去三年,这支团队换了两次文档管理系统,第二套系统上线8个月后被迫重建——原因是设计部门…...
把用户主数据放到该放的位置,聊透 SAP NetWeaver AS ABAP 里的 User Data Synchronization
在很多 SAP 项目里,用户主数据这一块最容易被低估。开发顾着接口,功能顾着流程,Basis 顾着系统连通,真正到了上线前夕,大家才发现一个很现实的问题,同一个员工在多个 ABAP 系统、企业目录、甚至底层数据库里,账号到底谁来建,密码谁来发,锁定状态谁来同步,姓名、部门、…...
LeetCode刷题实战:从Hot100到代码随想录的进阶之路
LeetCode刷题实战:从Hot100到代码随想录的进阶之路 在技术面试的战场上,算法题就像是一道道必须攻克的堡垒。无论是硅谷的科技巨头还是国内的互联网大厂,算法能力始终是衡量工程师基本功的重要标尺。对于准备秋招或技术面试的开发者来说&…...
