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

Web 中间件怎么玩?

本次主要是聊聊关于 web 中间件, 分为如下四个方面

  • 什么是 web 框架中间件
  • 为什么要使用 web 中间件
  • 如何使用及其原理
  • 哪些场景需要使用中间件

开门见山 web 中间件是啥

Web 框架中的中间件主要指的是在 web 请求到具体路由之前或者之后,会经过一个或者多个组件进行处理一些必要的公共逻辑(业务相关或者与业务无关的),而处理这些事项的部分,就称为 web 中间件

那是否会有这样的疑问?

明明就能直接请求到具体的路由,为什么要在它之前加一个中间件?

这是在增加程序复杂度?有啥事情不能直接在路由中做的吗?

我们可以带着这个问题继续往下看

为什么要使用中间件

一般很多技术或者很多组件大多是因为现有的工具无法满足日益正常的需求而慢慢出现的

例如

在 web 中需要对多个路由或者业务进行解耦,或者需要在多个路由之前或者之后加上一些统一的逻辑,这个时候就需要中间件来进行处理

又例如

我们的 web 服务需要有限流功能

如果我们 web 框架中只有几个路由,那么很简单,可能你会去对每个路由进行限流,那么如果是达到几十上百个路由你还会这样做吗?

如果已经有几十上百个路由了,需要针对所有路由统计一下程序处理时长,那么,这个时候你会去给这些路由一个一个的去复制粘贴代码吗?

正常人自然是不会的,我们会想办法寻求简单高效且保证质量的方式,明明使用一个中间件就能搞定的事情,何必去做无意义的卷王

多多提高效率去做更多有意义的事情不香吗?

中间件如何使用及其原理

此处咱们使用大名鼎鼎的高性能 web 框架 Gin 框架来举例子,使用 Gin 框架

Gin 中的中间件实际上就是一个 RouterGroup 对应的 handers 调用链 ,我们先来看一个例子,自定义两个最简单的中间件,先写一个 main

func main() {log.SetFlags(log.Lshortfile)r := gin.New()r.Use(Demo2())r.Use(Demo1())r.GET("/test", func(c *gin.Context) {log.Println("----inner test----")c.JSON(200, gin.H{"message": "demo",})})// 监听8080 端口r.Run(":8080")
}

Main 函数中,我们可以看到,开启了一个 web 服务,监听的端口是 8080,其中使用 Use 方法关联了 2 个中间件,分别是 Demo2 和 Demo1

Gin 框架中,先新建一个引擎,然后通过 Use 方法来将中间件和路由关联起来,这些中间件会对于每一个请求形成一个调用链

此处的调用链就是通过 Use 方法中使用 append 来进行追加的

// Use adds middleware to the group, see example code in GitHub.
func (group *RouterGroup) Use(middleware ...HandlerFunc) IRoutes {group.Handlers = append(group.Handlers, middleware...)return group.returnObj()
}

因此,对于我们自定义的中间件,先关联的中间件就先执行,后关联的中间件就后执行,这里我们简单写了两个自定义中间件

中间件,实际上就是去写一个这样的函数

// HandlerFunc defines the handler used by gin middleware as return value.
type HandlerFunc func(*Context)

对于 Demo1 自定义中间件实现是这样的

  • 代码在 c.Next() 前的会在请求具体接口之前进行运行
  • 在代码 c.Next() 后的代码会在执行完具体接口之后执行

可以看到此处我们简单的添加了打印,以及记录接口执行的时间

func Demo1() gin.HandlerFunc {return func(c *gin.Context) {// 请求接口之前a := time.Now()log.Println("--before--demo1----")c.Next()// 请求接口之后log.Println("--after--demo1----")dur := time.Since(a)log.Println("req Time consuming : ",dur)}
}

Demo2 也是类似的逻辑,仅仅是添加一些打印

程序运行起来,我们请求 localhost:8080/test 接口,即可查看到我们的打印信息如下

细心的朋友可以看出来,此处的中间件的执行顺序很明显是一个先进后出的效果,没错,此处的中间件确实做法如此

可以看到,执行顺序是这样的 Demo2 -> Demo1 -> /test 路由 -> Demo1 -> Demo2

那么对于 Gin 的中间件具体是个啥,如何使用你也会,是不是中间件不就那么回事呢?

自然,此处仅仅是做一个抛砖引玉,让不知 web 中间件的人知道其具体是何物

如果要深入研究,可以查看 Gin 的源码,还是非常有意思的,如果有必要,以后可以写一篇关于核心源码深入解读的

哪一些场景可以使用 web 中间件?

  • 接口限流场景

Gin 中有现成的限流组件 golang.org/x/time/rate , 具体关于限流相关的知识可以查看文末相关链接

  • 数据打点场景

例如记录接口响应时长,请求路由结果,一般这种打点数据数据会写到日志中,另外系统中有另外一个应用会来扫日志里面的记录,最终推到具体做日志分析和聚合的组件上

例如相关的组件就有 prometheus ,grafana 等等

  • 接口认证场景

例如 web 框架中需要做鉴权,例如接口需要校验 token 才能进入到具体的路由去做实际的业务,就可以把鉴权放到中间件中进行处理

  • 链路跟踪

对每一个请求都去带上 span ,实际上都是放到 ctx 来做文章,便于排查问题时,直接就可以看到整条链路中哪个节点出现了问题

  • 数据压缩,数据预处理等等,欢迎 xdm 进行补充哦

感谢阅读,欢迎交流,点个赞,关注一波 再走吧

欢迎点赞,关注,收藏

朋友们,你的支持和鼓励,是我坚持分享,提高质量的动力

技术是开放的,我们的心态,更应是开放的。拥抱变化,向阳而生,努力向前行。

我是阿兵云原生,欢迎点赞关注收藏,下次见~

文中提到的技术点,感兴趣的可以查看这些文章:

  • 简单理解微服务限流、降级、熔断
  • 最常用的限流算法以及如何在http中间件中加入流控
  • 分享一波gin的路由算法
  • Gin实战演练
  • 瞧一瞧 gRPC的拦截器

可以进入地址进行体验和学习:https://xxetb.xet.tech/s/3lucCI

相关文章:

Web 中间件怎么玩?

本次主要是聊聊关于 web 中间件, 分为如下四个方面 什么是 web 框架中间件 为什么要使用 web 中间件 如何使用及其原理 哪些场景需要使用中间件 开门见山 web 中间件是啥 Web 框架中的中间件主要指的是在 web 请求到具体路由之前或者之后,会经过一个或…...

HMTL知识点系列(4)

目录 1. 在你过去的项目中,你如何解决HTML的布局和样式问题?2. 你能否解释一下HTML的“文档对象模型”(DOM)是什么,以及它的重要性?3. 你有没有经验处理网页的兼容性问题,特别是在不同浏览器之间…...

CFS内网穿透靶场实战

一、简介 不久前做过的靶场。 通过复现CFS三层穿透靶场,让我对漏洞的利用,各种工具的使用以及横向穿透技术有了更深的理解。 一开始nmap探测ip端口,直接用thinkphpv5版本漏洞工具反弹shell,接着利用蚁剑对服务器直接进行控制,留下…...

【RabbitMQ实战】07 3分钟部署一个RabbitMQ集群

一、集群的安装部署 我们还是利用docker来安装RabbitMQ集群。3分钟安装一个集群,开始。 前提条件,docker安装了docker-compose。如果没安装的话,参考这里 docker-compose文件参考bitnami官网:https://github.com/bitnami/contai…...

PS 切片工具 选择切片 切片存储

上文 PS 透视裁剪工具 中 我们简单讲述了透视裁剪工具 今天 我们来讲他后面的切片工具 首先 他的用途还是很多的 例如 你有一个很大的图片 其中包括 轮播 导航 主题内容 但他们都在一个图片上 你就可以用切片工具 将完整的图片切成多个部分 这里 我们选择了切片工具 光标也会…...

Git版本控制系统

概念: 一个免费的 开源 分布式源码仓库,帮助团队维护代码 个人使用 多人联机使用 git安装: 这里直接看大佬的安装 文章 很不错的 git 安装配置https://blog.csdn.net/mukes/article/details/115693833 安装完毕之后: 使用命名git -v查看…...

Element UI搭建首页导航和左侧菜单以及Mock.js和(组件通信)总线的运用

目录 前言 一、Mock.js简介及使用 1.Mock.js简介 1.1.什么是Mock.js 1.2.Mock.js的两大特性 1.3.Mock.js使用的优势 1.4.Mock.js的基本用法 1.5.Mock.js与前端框架的集成 2.Mock.js的使用 2.1安装Mock.js 2.2.引入mockjs 2.3.mockjs使用 2.3.1.定义测试数据文件 2…...

What is an HTTP Flood DDoS attack?

HTTP 洪水攻击是一种针对 Web 和应用程序服务器的第 7 层分布式拒绝服务 (DDoS) 攻击。HTTP 洪水攻击通过使用 HTTP GET 或 HTTP POST 请求执行 DDoS 攻击。这些请求是有效的,并且针对可用资源,因此很难防范 HTTP 洪水攻击。 匿名…...

第 114 场 LeetCode 双周赛题解

A 收集元素的最少操作次数 模拟: 反序遍历数组&#xff0c;用一个集合存当前遍历过的不超过 k k k 的正数 class Solution { public:int minOperations(vector<int> &nums, int k) {unordered_set<int> vis;int n nums.size();int i n - 1;for (;; i--) {if…...

[Java框架] Java常用爬虫框架推荐

Selenium GitHub 截止 2023年9月份 Star数量27.7K Selenium是一款基于浏览器自动化的工具&#xff0c;它可以模拟用户在浏览器上的操作行为&#xff0c;并获取网页上的内容。Selenium支持多种浏览器&#xff0c;可以很好地处理JavaScript生成内容。但是Selenium相较于其他框架而…...

Kafka:安装与简单使用

文章目录 下载安装windows安装目录结构启动服务器创建主题发送一些消息启动消费者设置多代理集群常见问题 工具kafka tool 常用指令topic查看topic删除topic 常见问题参考文献 下载安装 下载地址&#xff1a;kafka-download windows安装 下载完后&#xff0c;找一个目录解压…...

029-从零搭建微服务-消息队列(一)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff08;后端&#xff09;&#xff1a;mingyue: &#x1f389; 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心 源…...

Python2020年06月Python二级 -- 编程题解析

题目一 数字转汉字 用户输入一个1~9&#xff08;包含1和9&#xff09;之间的任一数字&#xff0c;程序输出对应的汉字。 如输入2&#xff0c;程序输出“二”。可重复查询。 答案: 方法一 list1[一,二,三,四,五,六,七,八,九] while True:n int(input(请输入1~9之间任意一个数字…...

差分放大器的精髓:放大差模信号 抑制共模信号

参考如图基本的差分放大电路&#xff0c;在R1R2 R3R4的条件下&#xff0c;其输出与输入的关系为 &#xff1a; 具体推导过程参考&#xff1a;差分运算放大器的放大倍数的计算及结论_正在黑化的KS的博客-CSDN博客 由这个式子我们可以发现&#xff0c;差分放大器放大的是同相端与…...

蓝桥等考Python组别九级006

第一部分&#xff1a;选择题 1、Python L9 &#xff08;15分&#xff09; 运行下面程序&#xff0c;可以输出几行“*”&#xff1f;&#xff08; &#xff09; for i in range(6): for j in range(7): print(*, end ) print() 5678 正确答案&#xff1a;B 2、Python …...

初级篇—第五章子查询

文章目录 什么是子查询需求分析与问题解决子查询的基本语法结构子查询的分类 单行子查询单行比较操作符代码示例HAVING 中的子查询CASE中的子查询子查询中的空值问题非法使用子查询 多行子查询多行比较操作符代码示例空值问题 相关子查询代码示例在ORDER BY 中使用子查询EXISTS…...

【AntDesign】封装全局异常处理-全局拦截器

[toc] 场景 本文前端用的是阿里的Ant-Design框架&#xff0c;其他框架也有全局拦截器&#xff0c;思路是相同&#xff0c;具体实现自行百度下吧 因为每次都需要调接口&#xff0c;都需要单独处理异常情况&#xff08;code !0&#xff09;&#xff0c;因此前端需要对后端返回的…...

Visual Studio 代码显示空格等空白符

1.VS2010: 快捷键&#xff1a;CtrlR,W 2.VS2017、VS2019、VS2022&#xff1a; 工具 -> 选项 -> 文本编辑器 -> 显示 -> 勾选查看空白...

紫光同创FPGA图像视频采集系统,基于OV7725实现,提供工程源码和技术支持

目录 1、前言免责声明 2、设计思路框架视频源选择OV7725摄像头配置及采集动态彩条HDMA图像缓存输入输出视频HDMA缓冲FIFOHDMA控制模块HDMI输出 3、PDS工程详解4、上板调试验证并演示准备工作静态演示动态演示 5、福利&#xff1a;工程源码获取 紫光同创FPGA图像视频采集系统&am…...

京东大型API网关实践之路

概述 1、背景 京东作为电商平台&#xff0c;近几年用户、业务持续增长&#xff0c;访问量持续上升&#xff0c;随着这些业务的发展&#xff0c;API网关应运而生。 API网关&#xff0c;就是为了解放客户端与服务端而存在的。对于客户端&#xff0c;使开放给客户端的接口标准统…...

图像处理: 马赛克艺术

马赛克 第一章 马赛克的历史渊源 1.1 马赛克 艺术中的一种表面装饰&#xff0c;由紧密排列的、通常颜色各异的小块材料&#xff08;如石头、矿物、玻璃、瓷砖或贝壳&#xff09;组成。与镶嵌不同的是&#xff0c;镶嵌是将要应用的部件放置在已挖空以容纳设计的表面中&#xff0…...

postgresql-管理数据表

postgresql-管理数据表 创建表数据类型字段约束表级约束模式搜索路径 修改表添加字段删除字段添加约束删除约束修改字段默认值修改字段数据类型重命名字段重命名表 删除表 创建表 在 PostgreSQL 中&#xff0c;使用 CREATE TABLE 语句创建一个新表&#xff1a; CREATE TABLE …...

Llama2-Chinese项目:3.1-全量参数微调

提供LoRA微调和全量参数微调代码&#xff0c;训练数据为data/train_sft.csv&#xff0c;验证数据为data/dev_sft.csv&#xff0c;数据格式如下所示&#xff1a; "<s>Human: "问题"\n</s><s>Assistant: "答案举个例子&#xff0c;如下所…...

蓝桥等考Python组别十级001

第一部分:选择题 1、Python L10 (15分) 已知s = Hello!,下列说法正确的是( )。 s[1]对应的字符是Hs[2]对应的字符是ls[-1]对应的字符是os[3]对应的字符是o正确答案:B 2、Python L10 (15分) 运行下面程序,输入字符串“Banana”,输出的结果是&#x...

记录 Git 操作时遇到的问题及解决方案

目录 问题&#xff1a;git pull 时报错报错内容&#xff1a; ! [rejected] v1.0.3 -> v1.0.3 (would clobber existing tag)原因&#xff1a;本地 Git 仓库中已经存在名为 v1.0.3 和 v1.0.6 的标签了&#xff0c;而尝试从远程仓库&#xff08;GitHub&#xff09;拉取这些标签…...

第一届“龙信杯”电子数据取证竞赛Writeup

目录 移动终端取证 请分析涉案手机的设备标识是_______。&#xff08;标准格式&#xff1a;12345678&#xff09; 请确认嫌疑人首次安装目标APP的安装时间是______。&#xff08;标准格式&#xff1a;2023-09-13.11:32:23&#xff09; 此检材共连接过______个WiFi。&#x…...

Vue与React//双绑问题

Vue和React是两个目前最流行的前端框架&#xff0c;它们有一些区别主要区别如下&#xff1a; 响应式原理&#xff1a;Vue使用基于模板的方式进行双向绑定&#xff0c;其中使用了Vue自己实现的响应式系统。Vue能够通过追踪数据的依赖关系&#xff0c;自动更新DOM元素。而React采…...

信息安全第四周

社会工程学 社会工程学主要研究如何操纵人的心理和情感来获取机密信息或其他目标。它主要不是通过技术手段攻击计算机系统&#xff0c;而是通过心理学和人际交往技巧来欺骗人&#xff0c;使他们泄露密码、安全代码或其他敏感信息。社会工程学主要是一种安全风险&#xff0c;主要…...

机器学习基础概念与常见算法入门【机器学习、常见模型】

机器学习基础概念与算法 机器学习是计算机科学领域的一个分支&#xff0c;它致力于让计算机系统具备从数据中学习和改进的能力&#xff0c;而不需要显式地进行编程。与传统编程相比&#xff0c;机器学习有着根本性的不同之处。 机器学习与传统编程的不同 传统编程&#xff1…...

移动端 [Android iOS] 压缩 ECDSA PublicKey

移动端 [Android & iOS] 压缩 ECDSA PublicKey AndroidiOS 使用 Android KeyStore 和 iOS 的 Secure Enclave 提供的安全能力使用 P-256 来对 API 请求进行签名&#xff0c;服务器端再进行验证。 但是发现不论是 iOS 还是安卓都没有提供一个便捷的方式从 iOS 的SecKeyCopyE…...

专业集团门户网站建设方案/扬州网络优化推广

1 第2-3课&#xff1a;模板引擎 Thymeleaf 基础使用 1.1 模板引擎 模板引擎是为了使用户界面与业务数据&#xff08;内容&#xff09;分离而产生的&#xff0c;它可以生成特定格式的文档&#xff0c;用于网站的模板引擎就会生成一个标准的 HTML 文档。 模板引擎的实现方…...

wordpress 文章页 模板/广州网站快速优化排名

某天使用cmd窗口进入mysql&#xff0c;输入命令如下 C:\Users\xxx>net start mysql发生系统错误 5。 拒绝访问。 C:\Users\xxx>mysql -u root -pEnter password: ****ERROR 2003 (HY000): Cant connect to MySQL server on localhost:3306 (10061) 这个ERROR怎么解决…...

好的培训网站模板/郑州seo网站管理

我想告诉你Android开发你还在用JAVA吗&#xff1f;现在开始使用新的编程语言了&#xff0c;自从Kotlin成为谷歌官方语言后&#xff0c;你有没有心动呢&#xff1f; 我想告诉你一个名为Kotlin的新编程语言并且阐述为什么你应该考虑下一个项目中使用它。我以前非常喜欢使用JAVA,但…...

微网站 建设方案/发广告平台有哪些

如果A,B互不相容则P(AB)0...

怎样做 网站做seo/外国网站怎么进入

SELECT语句中子句的执行顺序与SELECT语句中子句的输入顺序是不一样的&#xff0c;所以并不是从SELECT子句开始执行的&#xff0c;而是按照下面的顺序执行&#xff1a; 开始->FROM子句->WHERE子句->GROUP BY子句->HAVING子句->ORDER BY子句->SELECT子句->…...

网站开发语言选择/枸橼酸西地那非片功效效及作用

链接&#xff1a;http://icpc.ahu.edu.cn/OJ/Problem.aspx?id740Description对于正整数n,k&#xff0c;我们定义这样一个函数f&#xff0c;它满足如下规律f(n,k1)-12-34-56...nf(n,k2)-1-234-5-6...nf(n,k3)-1-2-3456...nf(n,k4)-1-2-3-45678...n现在给出n和k&#xff0c;你的…...