gin框架中间件深度解析

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

@TOC


前言

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
相关文章
|
1天前
|
开发框架 Java 开发者
Spring框架的最新功能与应用案例解析
Spring框架的最新功能与应用案例解析
|
4天前
|
存储 缓存 Java
深入解析Spring框架中的ReflectionUtils
深入解析Spring框架中的ReflectionUtils
11 1
|
6天前
|
缓存 Java Maven
深入解析Google Guava库与Spring Retry重试框架
深入解析Google Guava库与Spring Retry重试框架
|
6天前
|
Java 数据处理 数据库
深入解析Spring Batch:企业级批处理框架的技术之旅
深入解析Spring Batch:企业级批处理框架的技术之旅
|
6天前
|
前端开发 数据库 开发者
构建高效后端:Django框架在Web开发中的深度解析
**Django框架深度解析摘要** Django,Python的高级Web框架,以其快速开发和简洁设计备受青睐。核心特性包括Model-Template-View架构、ORM、模板引擎和URL路由。通过创建博客应用示例,展示从初始化项目、定义模型、创建视图和URL配置到使用模板的流程,体现Django如何简化开发,提高效率。其强大功能如用户认证、表单处理等,使Django成为复杂Web应用开发的首选。学习Django,提升Web开发效率。【6月更文挑战第24天】
39 1
|
7天前
|
Java 程序员 调度
Java并发编程之Executor框架深度解析
【6月更文挑战第24天】在Java的并发编程领域,Executor框架是处理多线程任务的核心。本文将深入探讨Executor框架的设计哲学、核心组件以及如何高效利用这一框架来提升程序的性能和响应性。我们将通过实例演示如何正确配置和使用Executor,并讨论常见的陷阱与最佳实践。
|
11天前
|
存储 设计模式 ARouter
组件化框架 ARouter 完全解析(一)
组件化框架 ARouter 完全解析(一)
17 2
|
27天前
|
消息中间件 存储 NoSQL
阿里开源中间件一览
阿里开源中间件一览
29 2
|
2月前
|
算法 NoSQL Java
2023年阿里高频Java面试题:分布式+中间件+高并发+算法+数据库
又到了一年一度的金九银十,互联网行业竞争是一年比一年严峻,作为工程师的我们唯有不停地学习,不断的提升自己才能保证自己的核心竞争力从而拿到更好的薪水,进入心仪的企业(阿里、字节、美团、腾讯.....)
|
11月前
|
NoSQL Java Redis
阿里Java高级岗中间件二面:GC+IO+JVM+多线程+Redis+数据库+源码
虽然“钱多、事少、离家近”的工作可能离技术人比较远,但是找到一份合适的工作,其实并不像想象中那么难。但是,有些技术人确实是认真努力工作,但在面试时表现出的能力水平却不足以通过面试,或拿到高薪,其实不外乎以下 2 个原因:

推荐镜像

更多