gin框架中间件深度解析

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
性能测试 PTS,5000VUM额度
简介: gin框架中间件深度解析

前言

Gin在golang领域是一个非常有名的框架,也是github上面star最高的一个框架,简单易学,效率还高。所以我们大部分web开发都会使用gin框架来进行开发。但是Gin框架里面有一个比较关键的知识点,其中一个就是中间件。(不只是Gin,很多其他框架也是有中间件的概念)

一、中间件的作用

  1. Web请求到到达我们定义的HTTP请求处理方法之前,拦截请求并进行相应处理(比如:权限验证,数据过滤等),这个可以类比为前置拦截器或前置过滤器,
  2. 在我们处理完成请求并响应客户端时,拦截响应并进行相应的处理(比如:添加统一响应部头或数据格式等),这可以类型为后置拦截器或后置过滤器。

二、洋葱模型

在这里插入图片描述
在这里插入图片描述
看上图,我们的中间件就相当于一层一层的洋葱。如果要到洋葱内部,需要一层一层的进入。同理,出来也是一层一层的出来。

三、上代码

知道中间件的作用以及洋葱模型,我们就可以开始撸代码了。

这里以golang作为示例代码。其实只要知道具体的作用,不管用什么代码都是可以徒手写中间件的。

package main

import (
    "fmt"
    "math"
)

const abortIndex = math.MaxInt8 / 2

// 中间件结构体
type Context struct {
    Handlers []func(c *Context) //需要执行的方法切片
    index    int8               //偏移量
}

// 注册方法到中间件
func (this *Context) Use(f func(c *Context)) {
    this.Handlers = append(this.Handlers, f)
}

// 执行下一个方法
func (this *Context) Next() {
    if this.index < int8(len(this.Handlers)) {
        this.index++
        this.Handlers[this.index](this)
    }
}

// 执行handlers里面的第一个方法
func (this *Context) Run() {
    this.Handlers[0](this)
}

func (this *Context) GET(path string, f func(c *Context)) {
    this.Handlers = append(this.Handlers, f)
}

// 终止
func (this *Context) Abort() {
    this.index = abortIndex
}

//主方法
func main() {
    c := &Context{}
    c.Use(MiddlewareOne())
    c.Use(MiddlewareTwo())
    c.GET("/get", func(c *Context) {
        fmt.Println("执行具体方法")
    })
    c.Run()
}

//中间件一
func MiddlewareOne() func(c *Context) {
    return func(c *Context) {
        fmt.Println("MiddlerOne Start")
        c.Next()
        fmt.Println("MiddlerOne End")
    }
}
//中间件二
func MiddlewareTwo() func(c *Context) {
    return func(c *Context) {
        fmt.Println("MiddlerTwo Start")
        c.Next()
        fmt.Println("MiddlerTwo End")
    }
}
//中间件三
func MiddlewareThree() func(c *Context) {
    return func(c *Context) {
        fmt.Println("MiddlerThree Start")
        c.Next()
        fmt.Println("MiddlerThree End")
    }
}

大概讲一下代码的思路。首先我们定义一个中间件结构体,结构体里面分别有两个数据,一个是函数的切片。这个里面会存放所有的中间件函数,第二个是执行函数偏移量。也就是我们在一层层的剥洋葱时的层数,每深入一层,偏移量会加一。

这样我们在执行具体代码的时候的中间件执行顺序如下所示

main-&gt;MiddlewareOne-&gt;MiddlewareTwo-&gt;
那么我们控制台的输出结果就会如下

MiddlerOne Start
MiddlerTwo Start
执行具体方法
MiddlerTwo End
MiddlerOne End
相关文章
|
13天前
|
缓存 前端开发 中间件
[go 面试] 前端请求到后端API的中间件流程解析
[go 面试] 前端请求到后端API的中间件流程解析
|
21天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台框架解析
在移动应用开发的广阔舞台上,安卓和iOS一直是两大主角。随着技术的进步,开发者们渴望能有一种方式,让他们的应用能同时在这两大平台上运行,而不必为每一个平台单独编写代码。这就是跨平台框架诞生的背景。本文将探讨几种流行的跨平台框架,包括它们的优势、局限性,以及如何根据项目需求选择合适的框架。我们将从技术的深度和广度两个维度,对这些框架进行比较分析,旨在为开发者提供一个清晰的指南,帮助他们在安卓和iOS的开发旅程中,做出明智的选择。
|
7天前
|
安全 Java 数据库连接
后端框架的学习----mybatis框架(3、配置解析)
这篇文章详细介绍了MyBatis框架的核心配置文件解析,包括环境配置、属性配置、类型别名设置、映射器注册以及SqlSessionFactory和SqlSession的生命周期和作用域管理。
后端框架的学习----mybatis框架(3、配置解析)
|
1月前
|
JSON 中间件 数据处理
实践出真知:通过项目学习Python Web框架的路由与中间件设计
【7月更文挑战第19天】探索Python Web开发,掌握Flask或Django的关键在于理解路由和中间件。路由连接URL与功能,如Flask中@app.route()定义请求响应路径。中间件在请求处理前后执行,提供扩展功能,如日志、认证。通过实践项目,不仅学习理论,还能提升构建高效Web应用的能力。示例代码展示路由定义及模拟中间件行为,强调动手实践的重要性。
36 1
|
13天前
|
XML JSON Go
[gin]数据解析和绑定
[gin]数据解析和绑定
|
1月前
|
缓存 监控 安全
中间件在Python Web框架中的角色与应用场景
【7月更文挑战第21天】中间件在Python Web开发中作为服务器与应用间的软件层,拦截、处理请求和响应,无需改动应用代码。它扩展框架功能,复用跨应用逻辑,加强安全,优化性能。如Django中间件处理请求/响应,Flask通过WSGI中间件实现类似功能,两者均在不触及核心代码前提下,灵活增强应用行为,是现代Web开发关键组件。
27 0
|
1月前
|
中间件 数据库 开发者
解析Python Web框架的四大支柱:模板、ORM、中间件与路由
【7月更文挑战第20天】Python Web框架如Django、Flask、FastAPI的核心包括模板(如Django的DTL和Flask的Jinja2)、ORM(Django的内置ORM与Flask的SQLAlchemy)、中间件(Django的全局中间件与Flask的装饰器实现)和路由(Django的urls.py配置与Flask的@app.route()装饰器)。这些组件提升了代码组织和数据库操作的便捷性,确保了Web应用的稳定性和可扩展性。
33 0
|
1月前
|
中间件 API 开发者
深入理解Python Web框架:中间件的工作原理与应用策略
【7月更文挑战第19天】Python Web中间件摘要:**中间件是扩展框架功能的关键组件,它拦截并处理请求与响应。在Flask中,通过`before_request`和`after_request`装饰器模拟中间件行为;Django则有官方中间件系统,需实现如`process_request`和`process_response`等方法。中间件用于日志、验证等场景,但应考虑性能、执行顺序、错误处理和代码可维护性。
40 0
|
3月前
|
消息中间件 存储 负载均衡
消息中间件的选择:RabbitMQ是一个明智的选择
消息中间件的选择:RabbitMQ是一个明智的选择
81 0
|
2月前
|
消息中间件 存储 中间件
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
【消息中间件】详解三大MQ:RabbitMQ、RocketMQ、Kafka
153 0

推荐镜像

更多