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

石岩网站设计网站规划和建设的基本步骤

石岩网站设计,网站规划和建设的基本步骤,深圳市建设局网站,东莞网站建站模板本次主要是聊聊关于 web 中间件, 分为如下四个方面 什么是 web 框架中间件 为什么要使用 web 中间件 如何使用及其原理 哪些场景需要使用中间件 开门见山 web 中间件是啥 Web 框架中的中间件主要指的是在 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

http://www.yayakq.cn/news/819427/

相关文章:

  • 昆山做网站优化重庆建设人才促进网
  • 网站栏目建设图app营销推广方式
  • 二级域名做城市分网站公司网站备案后在百度上多长时间可以搜索到
  • 西安网络建设公司seo咨询茂名
  • 美食网站功能建设江西企业网站建设哪家好
  • 中国建设银行山西省分行网站建设厅和应急管理厅焊工证区别
  • 建筑公司网站建设方案seo网站推广免费
  • 好口碑关键词优化常德自助建站seo
  • 网站建设的自查报告深圳网站制作hi0755
  • 多个wordpress网站合并网站建设仟首先金手指13
  • wordpress动漫整站关于网站建设的技巧
  • 推广赚钱软件网站初期seo怎么做
  • 自助网站建设工具2014年网站开发语言
  • 网站怎么使用模板高端医疗器械网站源码
  • 温州百度网站推广湖北省公共资源交易中心
  • 陕西教育建设信息网站南海顺德网站建设费用
  • 网站上飘窗怎么做上海网页制作系统
  • 网站建设页头的设计网站建设 客户定位
  • 从化网站建设价格给设计网站做图是商用吗
  • 河南省城乡和住房建设厅网站网站关键词怎么改
  • 做卖蜂蜜的网站计划书动力网站代码
  • 微信做商城网站手机网站底部漂浮代码
  • 17zwd一起做网站株洲站有没有专业做网站架构图的软件
  • 免费推广网站哪家好网站建设岗位有哪些
  • 微信网站 影楼潍坊快速建站模板
  • wordpress好看的商城优化网站架构
  • 网站模板如何删除鞍山网站制作推广
  • 网站开发首选畅扬科技wordpress问题解决方法
  • 方城企业网站制作哪家好网页设计工作室
  • 嘉定网站设计制作托管维护网站建设推广选stso88效果好