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

go-zero(八) 中间件的使用

go-zero 中间件

一、中间件介绍

中间件(Middleware)是一个在请求和响应处理之间插入的程序或者函数,它可以用来处理、修改或者监控 HTTP 请求和响应的各个方面。

1.中间件的核心概念

  1. 请求拦截:中间件能够在请求到达目标处理器之前,对请求进行分析、修改或记录。

  2. 响应拦截:同样,中间件也可以在响应返回给客户端之前,对响应进行处理,例如添加 headers、压缩响应体、格式化响应数据等。

  3. 链式调用:多个中间件可以串联在一起,形成一个中间件链,依次处理请求和响应。

2.中间件的用途

中间件可以用于以下多个方面:

  1. 日志记录:记录 HTTP 请求和响应的详细信息,例如请求路径、方法、状态码等。这有助于进行审计和调试。

  2. 认证和授权:验证请求是否具有必要的权限,确保用户或系统的身份是否合法。这对于保护敏感接口尤其重要。

  3. 请求限流:控制访问速率,避免服务被恶意请求或流量洪水淹没。这可以提高系统的稳定性和可用性。

  4. 跨域资源共享 (CORS):处理浏览器的跨域请求。中间件可以在响应中添加适当的 CORS 头,允许来自不同源的请求。

  5. 错误处理:捕获处理过程中的错误(如 panic)并生成适当的 HTTP 响应。这样可以确保系统在错误情况下不会崩溃,并能够正常返回相应。

  6. 数据格式化:统一请求和响应的数据格式,例如将响应数据转换为 JSON 格式,或者对请求中的参数进行验证和转换。

  7. 国际化 (i18n):处理用户的语言偏好和内容的本地化,使应用能够支持多语言。

3.中间件的工作流程

一般来说,工作流程如下:

  1. 用户发起请求,请求到达 Web 服务器。
  2. 中间件链开始处理:
    • 第一个中间件接收请求,进行相应的处理(如日志记录)。
    • 控制权传递给下一个中间件。
    • 这个过程可以一直持续,直到所有中间件处理完请求。
  3. 最终请求到达目标处理器,处理器生成响应。
  4. 响应同样会经过中间件链进行处理(如添加 headers)。
  5. 最终响应返回给用户。

二、go-zero内置中间件介绍

go-zero 提供了一系列内置的中间件, 之前我们使用的JWT鉴权就使用了内置的鉴权管理中间件 帮助我们实现了自动验证Token。

在 go-zero 中内置了如下中间件:

  • 鉴权管理中间件 AuthorizeHandler
  • 熔断中间件 BreakerHandler
  • 内容安全中间件 ContentSecurityHandler
  • 解密中间件 CryptionHandler
  • 压缩管理中间件 GunzipHandler
  • 日志中间件 LogHandler
  • ContentLength 管理中间件 MaxBytesHandler
  • 限流中间件 MaxConnsHandler
  • 指标统计中间件 MetricHandler
  • 普罗米修斯指标中间件 PrometheusHandler
  • panic 恢复中间件 RecoverHandler
  • 负载监控中间件 SheddingHandler
  • 超时中间件 TimeoutHandler
  • 链路追踪中间件 TraceHandler

这些中间件的具体实现可以去看github.com\zeromicro\go-zero@v1.7.3\rest\handler目录的内容。

1. 开/关中间件

以上中间件默认启用, 如果想要关闭其中的中间件,我们可以通过配置文件来控制。

如果你看过RestConf 的代码,就应该能看到,它里面包含了一个Middlewares 中间件的配置结构。

	RestConf struct {service.ServiceConfHost     string `json:",default=0.0.0.0"`Port     int/*....*///中间件配置相关的结构体Middlewares MiddlewaresConf// TraceIgnorePaths is paths blacklist for trace middleware.}

我们可以看下它的具体内容,可以看到这个结构体主要用来控制,这些中间件是否启动,默认都是开启状态:

MiddlewaresConf struct {Trace      bool `json:",default=true"`Log        bool `json:",default=true"`Prometheus bool `json:",default=true"`MaxConns   bool `json:",default=true"`Breaker    bool `json:",default=true"`Shedding   bool `json:",default=true"`Timeout    bool `json:",default=true"`Recover    bool `json:",default=true"`Metrics    bool `json:",default=true"`MaxBytes   bool `json:",default=true"`Gunzip     bool `json:",default=true"`}

那么如何控制这些中间件是否关闭就很简单了,例如我想关闭普罗米修斯指标中间件,打开yaml文件:

Middlewares:Prometheus: false #把值设置为false

关于内置中间件展示就介绍这么多,后面有机会给大家详细介绍下具体的使用方法。

三、自定义中间件

1.局部中间件

在 go-zero 中,我们通过 api 语言来声明 HTTP 服务,然后通过 goctl 生成 HTTP 服务代码。

type (RegisterRequest {//请求体定义了 Username 和Password 字段, 并且都设置了不能为空Username string `json:"username" validate:"required"`Password string `json:"password" validate:"required"`}RegisterResponse {//响应体 定义类一个Message  用来返回结果Message string `json:"message"`}
)type (LoginRequest {Username string `json:"username" validate:"required"`Password string `json:"password" validate:"required"`}LoginResponse {Token string `json:"token"`}
)@server (group:      user // 代表当前 service 代码块下的路由生成代码时都会被放到 user 目录下prefix:     /v1 //定义路由前缀为 "/v1"middleware: TestMiddleware    
)

在上面的例子中,我们声明了一个中间件TestMiddleware,然后在 @server 中通过 middileware 关键字来声明中间件。

需要说明的,我们这个中间件是局部中间件,仅对当前的server有效 #EE3F4D

使用以下命令更新代码:

goctl api go --api user.api --dir .

命令执行完后,会在项目中生成middleware文件夹,我们可以先看下routes.go文件,可以看到这路由前面帮我加了一个中间件

在这里插入图片描述

接下来我们打开middleware目录下的文件,我们简单的添加一个header信息,修改代码:

func (m *TestMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {// TODO generate middleware implement function, delete after code implementation//我们自定义一个header信息w.Header().Set("xxxx", "aaaabb")next(w, r)}
}

然后把中间件注册到服务中,打开servicecontext.go文件:

type ServiceContext struct {Config                config.ConfigUserModel             model.UsersModelUserRpc               user.UserTestMiddleware rest.Middleware  //定义中间件
}func NewServiceContext(c config.Config) *ServiceContext {return &ServiceContext{Config:                c,UserModel:             model.NewUsersModel(sqlx.NewMysql(c.MysqlDB.DbSource)),UserRpc:               user.NewUser(zrpc.MustNewClient(c.UserRpcConf)),//初始化中间件TestMiddleware Middleware: middleware.NewTestMiddleware Middleware().Handle,}
}

运行项目测试
在这里插入图片描述

2. 全局中间件

下面我们演示下全局中间件

首先我们创建一个 Middleware 方法:

func GlobalMiddleware(next http.HandlerFunc) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {logx.Info("全局中间件")next(w, r)}
}

然后将其注册到 go-zero 的 rest 中

func main() {flag.Parse()var c config.Configconf.MustLoad(*configFile, &c)server := rest.MustNewServer(c.RestConf)defer server.Stop()//使用Use 注册中间件server.Use(middleware.GlobalMiddleware)ctx := svc.NewServiceContext(c)handler.RegisterHandlers(server, ctx)fmt.Printf("Starting server at %s:%d...\n", c.Host, c.Port)server.Start()
}

相关文章:

go-zero(八) 中间件的使用

go-zero 中间件 一、中间件介绍 中间件(Middleware)是一个在请求和响应处理之间插入的程序或者函数,它可以用来处理、修改或者监控 HTTP 请求和响应的各个方面。 1.中间件的核心概念 请求拦截:中间件能够在请求到达目标处理器之…...

vim 如何高亮/取消高亮

高亮 :在ESC模式下使用 shift # 取消高亮:在ESC模式下输入英文输入 :nohl (no highlight)...

蓝桥杯练习题

目录 1.劲舞团 2.数字诗意 3.封闭图形个数 4.回文数组 欢迎 1.劲舞团 0劲舞团 - 蓝桥云课 #include <iostream> using namespace std; int main() {int num1,M0;long long c[1000000];int cnt0;string a,b ;while(cin>>a>>b>>c[cnt])//系统自动输入…...

【设计模式】创建型模式之单例模式(饿汉式 懒汉式 Golang实现)

定义 一个类只允许创建一个对象或实例&#xff0c;而且自行实例化并向整个系统提供该实例&#xff0c;这个类就是一个单例类&#xff0c;它提供全局访问的方法。这种设计模式叫单例设计模式&#xff0c;简称单例模式。 单例模式的要点&#xff1a; 某个类只能有一个实例必须…...

使用 Docker Compose 来编排部署LMTNR项目

使用 Docker Compose 来部署一个包含 Linux、MySQL、Tomcat、Nginx 和 Redis 的完整项目的例子。假设我们要部署一个简单的 Java Web 应用&#xff0c;并且使用 Nginx 作为反向代理服务器。 项目目录结构 首先需要确保 Docker 和docker-compose已经安装并正在运行。docker --v…...

创建HTTPS网站

每天&#xff0c;我们都会听到网络上发生身份盗窃和数据侵权的案例&#xff0c;这导致用户对自己访问的网站更加怀疑。他们开始更加了解自己将个人信息放在哪里以及信任哪些类型的网站。了解如何使网站使用HTTPS变得比以往任何时候都更加重要。 解读缩略词&#xff1a;HTTP与HT…...

以3D数字人AI产品赋能教育培训人才发展,魔珐科技亮相AI+教育创新与人才发展大会

11月20日&#xff0c;北京中关村国际创新中心迎来了“AI教育创新与人才发展大会暨首届北京数字人才发展大会”的盛大启幕。此次大会汇聚了培训、教育、科技、人才领域的专家学者、行业领袖及企业代表&#xff0c;共同探讨人工智能技术在教育培训领域的革新应用与数字人才培养体…...

springboot配置https,并使用wss

学习链接 springboot如何将http转https SpringBoot配置HTTPS及开发调试 Tomcat8.5配置https和SpringBoot配置https 可借鉴的参考&#xff1a; springboot如何配置ssl支持httpsSpringBoot配置HTTPS及开发调试的操作方法springboot实现的https单向认证和双向认证(java生成证…...

Qt SQL模块概述

Qt SQL支持的数据库 要在项目中使用 Qt SQL 模块&#xff0c;需要在项目配置文件中添加下面一条设置语句&#xff1a; Qt sql在头文件或源文件中使用 Qt SQL 模块中的类&#xff0c;可以使用包含语句&#xff1a; #include <QtSql>这样会将某个 Qt SQL 模块中的所有类…...

JavaWeb后端开发知识储备2

目录 1.HttpClient 2.微信小程序开发 3.Spring Cache 4.Spring Task 4.1cron表达式 4.2入门案例 5.WebSocket协议 1.HttpClient 简单来说&#xff0c;HttpClient可以通过编码的方式在Java中发送Http请求 2.微信小程序开发 微信小程序的开发本质上是前端开发&#xff0…...

RabbitMQ原理架构解析:消息传递的核心机制

文章目录 一、RabbitMQ简介1.1、概述1.2、特性 二、RabbitMQ原理架构三、RabbitMQ应用场景3.1、简单模式3.2、工作模式3.3、发布订阅3.4、路由模式3.5 主题订阅模式 四、同类中间件对比五、RabbitMQ部署5.1、单机部署5.2、集群部署&#xff08;镜像模式&#xff09;5.3、K8s部署…...

redmi 12c 刷机

刷机历程 一个多月前网购了redmi 12c这款手机, 价格只有550,用来搞机再适合不过了, 拆快递后就开始倒腾,网上有人说需要等7天才能解锁,我绑定了账号过了几天又忍不住倒腾,最后发现这块手机不用等7天解锁成功了,开始我为了获取root权限, 刷入了很火的magisk,但是某一天仍然发现/…...

四、Python —— 列表

文章目录 一、列表的初始化1.1、直接初始化1.2、通过 append 函数初始化1.3、 通过 for 语句初始化列表长度和每个位置的数值 二、访问列表元素2.1、越界的含义 三、 使用循环语句遍历列表3.1、通过下标遍历3.2、通过 for...in... 直接遍历 四、列表的切片操作五、列表的复制六…...

Paper -- 建筑高度估计 -- 基于街景图像和深度学习的城区建筑高度计算

基本信息 论文题目: Building height calculation for an urban area based on street view images and deep learning 中文题目: 基于街景图像和深度学习的城区建筑高度计算 作者及单位: – Zhen Xu Furong Zhang Yingying Wu Yajun Yang Yuan Wu – 北京科技大学城市与安全研…...

机器学习周志华学习笔记-第6章<支持向量机>

机器学习周志华学习笔记-第6章<支持向量机> 卷王&#xff0c;请看目录 6支持向量机6.1 函数间隔与几何间隔6.1.1 函数间隔6.1.2 几何间隔 6.2 最大间隔与支持向量6.3 对偶问题6.4 核函数6.5 软间隔支持向量机6.6 支持向量机6.7核方法 6支持向量机 支持向量机是一种经典…...

第三届航空航天与控制工程国际 (ICoACE 2024)

重要信息 会议官网&#xff1a;www.icoace.com 线下召开&#xff1a;2024年11月29日-12月1日 会议地点&#xff1a;陕西西安理工大学金花校区 &#xff08;西安市金花南路5号&#xff09; 大会简介 2024年第三届航空航天与控制工程国际学术会议&#xff08;ICoACE 2024&a…...

【大数据技术基础】 课程 第8章 数据仓库Hive的安装和使用 大数据基础编程、实验和案例教程(第2版)

第8章 数据仓库Hive的安装和使用 8.1 Hive的安装 8.1.1 下载安装文件 访问Hive官网&#xff08;http://www.apache.org/dyn/closer.cgi/hive/&#xff09;下载安装文件apache-hive-3.1.2-bin.tar.gz 下载完安装文件以后&#xff0c;需要对文件进行解压。按照Linux系统使用的…...

BERT 详解

BERT简介 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是由 Google 在 2018 年提出的一种预训练语言模型。BERT 在自然语言处理&#xff08;NLP&#xff09;领域取得了重大突破&#xff0c;因为它能够有效地捕捉文本的上下文信息&am…...

使用 MySQL 的 REPLACE() 函数轻松替换表中字段

前言 在数据库操作中&#xff0c;经常需要对存储的数据进行一些处理和修改&#xff0c;替换字段中的部分信息。MySQL 提供了多种字符串函数来帮助开发者完成这些任务。其中一个非常实用的函数就是 REPLACE()。 REPLACE() 函数简介 REPLACE() 函数用于在字符串中查找指定的子…...

Http 响应协议

HTTP的响应协议 响应数据格式 响应行 响应数据的第一行&#xff0c;包括协议、状态码、描述 响应头 从响应数据格式的第二行开始&#xff0c;也是以key:value的格式 响应体 和响应头之间有一个空行&#xff0c;是响应数据格式的最后一部分&#xff0c;用于存放响应的数据 常见响…...

TCP/IP 协议:网络世界的基石(2/10)

一、引言 在当今数字化时代&#xff0c;互联网已经成为人们生活中不可或缺的一部分。而在互联网的背后&#xff0c;TCP/IP 协议扮演着至关重要的角色&#xff0c;堪称互联网的基石。 TCP/IP 协议是一组用于数据通信的协议集合&#xff0c;它的名字来源于其中最重要的两个协议…...

Lua--1.基础知识

Lua基础知识 变量简单的4种变量类型复杂的4种变量类型type函数 字符串操作长度获取--#多行打印字符串拼接别的类型转字符串-- tostring()字符串提供的公共方法 运算符算术运算符-- - * / % ^条件运算符-- > < > < ~(不等于 是 ~)逻辑运算符-- and or not位运算、…...

【GPT】力量训练的底层原理?

详细解读力量训练的每一个底层原理 力量训练之所以有效&#xff0c;是因为它利用了肌肉、神经系统和生物化学反应的基本机制。以下逐一详细解析&#xff0c;并解释相关概念。 1. 应力-恢复-适应理论 概念解析 应力&#xff08;Stress&#xff09;&#xff1a;指训练带来的负…...

各种排序算法

前置知识 排序: 按照递增或者递减的顺序把数据排列好 稳定性: 值相等的元素在排序之后前后顺序是否发生了改变 内部排序: 数据放在内存上 外部排序: 数据放在磁盘上 内部排序 基于比较的排序 几大排序算法 1. 堆排序 特点: 思想: 1. 创建大根堆,把所有元素放在大根堆里…...

源码解读笔记:协程的 ViewModel.viewModelScope和LifecycleOwner.lifecycleScope

分析下ViewModel.viewModelScope public val ViewModel.viewModelScope: CoroutineScopeget() {val scope: CoroutineScope? this.getTag(JOB_KEY)if (scope ! null) {return scope}return setTagIfAbsent(JOB_KEY,CloseableCoroutineScope(SupervisorJob() Dispatchers.Ma…...

11.27周三F34-Day8打卡

文章目录 1. 学习让我感觉很棒。(什么关系?动作 or 描述?主语部分是?)解析答案:【解析答案分析】【对比分析】【拓展内容】2. 她忽然想起来钥匙放另一个包里了。解析答案:【拓展内容】3. 她来不来都没关系。(该由什么引导?这句话又属于什么关系,动作 or 描述?)解析答案…...

XG(S)-PON原理

前言 近年来&#xff0c;随着全球范围内接入市场的飞快发展以及全业务运营的快速开展&#xff0c;已有的PON技术标准在带宽需求、业务支撑能力以及接入节点设备和配套设备的性能提升等方面都面临新的升级需求XG(S)-PON(10G GPON)是在已有GPON技术标准上演进的增强下一代GPON技…...

C语言实例之9斐波那契数列实现

1. 斐波那契数列简介 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多・斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为 “兔子数列”。 它的特点是从第三…...

YOLO系列论文综述(从YOLOv1到YOLOv11)【第1篇:概述物体检测算法发展史、YOLO应用领域、评价指标和NMS】

目录 1 前言2 YOLO在不同领域的应用3 物体检测指标和NMS3.1 mAP和IOU3.2 mAP计算流程3.2.1 VOC 数据集3.2.2 微软 COCO 数据集 3.3 NMS 1 前言 最近在做目标检测模型相关的优化&#xff0c;重新看了一些新的论文&#xff0c;发现了几篇写得比较好的YOLO系列论文综述&#xff0…...

数据结构--Map和Set

目录 一.二叉搜索树1.1 概念1.2 二叉搜索树的简单实现 二.Map2.1 概念2.2 Map常用方法2.3 Map使用注意点2.4 TreeMap和HashMap的区别2.5 HashMap底层知识点 三.Set3.1 概念3.2 Set常用方法3.3 Set使用注意点3.4 TreeSet与HashSet的区别 四.哈希表4.1 概念4.2 哈希冲突与避免4.3…...

广州美容网站建设/googleseo优化

vue监听浏览器tab切换 描述 监听tab切换浏览器页面&#xff0c;在离开当前页面和再次进来发生事件监听&#xff0c;类似与小程序的show函数 visibilitychange 详解 解决 created() {document.addEventListener(visibilitychange, () > {if(document.visibilityState h…...

毕业设计做网站应该学什么/页优化软件

DB_USER>root,DB_PWD>123456,至此&#xff0c;能够成功登录了&#xff01;2.如何进入修改密码后的phpmyadmin经过上面的修改后&#xff0c;发现登录不了phpmyadmin了&#xff0c;再打开phpMyAdmin就显示&#xff1a;“phpMyAdmin 试图连接到 MySQL 服务器&#xff0c;但服…...

网站建设白沟/廊坊快速排名优化

晓查 萧箫 明敏 鱼羊 发自 凹非寺量子位 | 公众号 QbitAI张朝阳当物理老师还真是当上瘾了。刚刚直接完成了一场线下课&#xff0c;当场手推质能方程&#xff0c;一整面黑板墙都差点没盛下。这个姿势&#xff0c;是不是有你大物老师内范儿了&#xff08;手动狗头&#xff09;。‍…...

网站百度分享怎么做/自己怎么做网页推广

最近项目要用ext进行开发&#xff0c;所以这段时间开始学习ext. 我这里用的是ext3.0,eclipse3.5。 每次都要去查API&#xff0c;很烦&#xff0c;所以装个EXT提示的插件对初学者来说有很大的帮助。 假设你已经下载了ext3.0和spket的源码。 注意&#xff0c;官方的ext3.0里面…...

动漫网站 设计/百度刷排名seo软件

使用OracleClient 来操作Oracle(Version - 7.3.4.4.0) 发现当遇到字符串内容为中文的时候无法使用parameter 的形式来得到select 的结果。跟踪调试整个过程没有发现任何异常的情况。最后使用Oledb问题解决。个人总结,在Oracle(Version - 8以上版本)可以使用OracleClient没有问题…...

table做网站/网站推广优化方案

在filter中经常会遇到>begindate这样的例子 而最终导致和日期提示控件之间相互比较的时候报错&#xff0c;日期格式类错误 于是做了如下的操作&#xff0c;再次用新的参数添加过滤器&#xff0c;一切正常。神奇的mysql. 第一步&#xff1a; cast([日期],varchar(8)) 第二步&…...