Go中Gin中间件的实现

 更新时间:2026年07月07日 08:46:21   作者:H_拾忆  
Gin 中间件可实现日志、鉴权、限流等功能,具备模块化、链式调用、上下文操控等特点,本文就来介绍了Go中Gin中间件的实现,感兴趣的可以了解一下

1.Gin中间件:

Gin中间件可以用于多种用途.例如记录日志 验证身份 限流 处理错误等.开发者可以自定义中间件,或者使用Gin提供的中间件.

2.Gin中间件特点:

2.1模块化:中间件可以在不影响程序核心功能的情况下添加 删除 或者修改.

2.2可重用性:中间件可以在多个程序和路由中使用.

2.3可链式调用:允许按照特定顺序调用多个中间件处理请求.

2.4互操作性:中间件能够与程序中使用的其他中间件和第三方兼容.

2.5上下文感知:中间件可以访问并修改请求和响应对象,以及其他相关的上下文信息.

2.6错误处理机制:中间件可以确保错误能够被正常处理,不会导致出现意外行为.

3.Gin的关键组件:

3.1函数签名:一个接收*gin.Context对象的函数.

3.2返回值:返回一个gin.HandlerFunc,这是gin中间件函数必须满足的类型.

3.3中间件逻辑:在中间件函数内部执行任何必要的操作,例如日志记录 身份验证 请求验证或者修改请求和响应.

3.4中间件demo:

func LoggerHandler() gin.HandlerFunc  {
	
	return func(c *gin.Context) {
		log.Printf("%s %s %s", c.Request.Method, c.Request.RequestURI, c.ClientIP())
		c.Next()
	}
}

3.5中间件使用:

package main

import (
	"github.com/gin-gonic/gin"
	"log"
)

func main() {
	request := gin.Default()
	//使用中间件
	request.Use(LoggerHandler())
	
	//定义一个路由处理器.
	request.GET("/test", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"message": "hello world",
		})
	})
	request.Run()
}

4.Gin中间件使用:

package main

import (
	"github.com/gin-gonic/gin"
	"log"
)

func main() {
	request := gin.Default()
	//定义中间件
	request.Use(func(c *gin.Context) {
		c.Set("name", "itBo")
		c.Next()
	})

	//定义一个路由处理器.
	request.GET("/", func(c *gin.Context) {
		name, exists := c.Get("name")

		if !exists {
			c.String(200, "用户名不存在")
			return
		}

		c.String(200, "你好,%s", name)
	})
	request.Run()
}

服务器接收到请求后,中间件函数会在路由处理函数之前执行,所以会成功的获取到值.

5.自定义中间件:

package main

import (
	"github.com/gin-gonic/gin"
	"log"
	"net/http"
	"time"
)

func main() {
	request := gin.Default()
	//定义中间件
	request.Use(myMiddlewareHandler())

	//定义一个路由处理器.
	request.GET("/", func(c *gin.Context) {
		c.String(http.StatusOK, "Hello World")
	})
	request.Run()
}

func myMiddlewareHandler() gin.HandlerFunc {
	return func(c *gin.Context) {
		//请求前操作.
		startTime := time.Now()
		c.Set("startTime", startTime)
		//处理请求.
		c.Next()
		//请求后的操作,计算处理时间并记录日志.
		endTime := time.Since(startTime)
		log.Printf("请求处理时间: %s", endTime)
	}
}

6.Gin中间件实现速率限制:

package main

import (
	"github.com/gin-gonic/gin"
	"log"
	"net/http"
	"sync"
	"time"
)

type RateLimiter struct {
	sync.Mutex
	Requests map[string]int
}

func RateLimiterHandler(rateLimiter *RateLimiter, limit int, interval time.Duration) gin.HandlerFunc {
	return func(c *gin.Context) {
		ip := c.ClientIP()

		rateLimiter.Lock()
		requests := rateLimiter.Requests[ip]
		if requests >= limit {
			rateLimiter.Unlock()
			c.AbortWithStatusJSON(http.StatusTooManyRequests, gin.H{"error": "request too many"})
			return
		}
		rateLimiter.Requests[ip] = requests + 1
		rateLimiter.Unlock()

		//在指定时间后,减少请求次数.
		go func() {
			time.Sleep(interval)
			rateLimiter.Lock()
			rateLimiter.Requests[ip]--
			if rateLimiter.Requests[ip] <= 0 {
				delete(rateLimiter.Requests, ip)
			}
			rateLimiter.Unlock()
		}()
		c.Next()
	}
}

func main() {
	request := gin.Default()
	//设置速率限制中间件
	rateLimit := &RateLimiter{Requests: make(map[string]int)}
	request.Use(RateLimiterHandler(rateLimit, 2, 5*time.Minute))

	//定义一个路由处理器.
	request.GET("/", func(c *gin.Context) {
		c.String(http.StatusOK, "Hello World")
	})
	request.Run()
}

到此这篇关于Go中Gin中间件的实现的文章就介绍到这了,更多相关Gin中间件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Golang使用Gin框架实现HTTP上传文件过程介绍

    Golang使用Gin框架实现HTTP上传文件过程介绍

    由于需求中有文件上传这一个需求,在这里我们就学习一下go语言如何上传文件。本文主要通过表单的方式进行文件上传操作,本文实例为大家分享了Go实现文件上传操作的具体代码,供大家参考,具体内容如下
    2023-04-04
  • Go协程的底层原理及分析

    Go协程的底层原理及分析

    文章解释了操作系统中的进程、线程和协程的概念及其区别,并详细描述了Go语言中协程的工作原理和调度机制,包括G-M-P模型、抢占式调度、基于信号的抢占式调度等
    2026-05-05
  • 深入理解Go语言的Type-Value Pair(类型-值对)的使用

    深入理解Go语言的Type-Value Pair(类型-值对)的使用

    本文主要介绍了深入理解Go语言的Type-Value Pair(类型-值对)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-03-03
  • golang package time的用法具体详解

    golang package time的用法具体详解

    本篇文章主要介绍了golang package time的用法具体详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-05-05
  • 详解golang避免循环import问题(“import cycle not allowed”)

    详解golang避免循环import问题(“import cycle not allowed”)

    这篇文章主要给大家介绍了关于golang中不允许循环import问题("import cycle not allowed")的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧
    2018-08-08
  • golang 执行命令行的实现

    golang 执行命令行的实现

    本文主要介绍了golang 执行命令行的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Go语言基础变量的声明及初始化示例详解

    Go语言基础变量的声明及初始化示例详解

    这篇文章主要为大家介绍了Go语言基础变量的声明及初始化示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步,早日升职加薪
    2021-11-11
  • grpool goroutine池协程管理

    grpool goroutine池协程管理

    这篇文章主要介绍了grpool goroutine池协程管理,goroutine协程非常轻量级,这也是为什么go支持高并发,但是goroutine频繁创建销毁对GC的压力比较大,文章围绕主题展开详细的内容介绍,需要的小伙伴可以参考一下
    2022-06-06
  • Go语言数据结构之单链表的实例详解

    Go语言数据结构之单链表的实例详解

    链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。本文将通过五个例题带大家深入了解Go语言中单链表的用法,感兴趣的可以了解一下
    2022-08-08
  • 详解go语言中并发安全和锁问题

    详解go语言中并发安全和锁问题

    这篇文章主要介绍了go语言中并发安全和锁问题,包含互斥锁解锁过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10

最新评论