Golang

关注公众号 jb51net

关闭
首页 > 脚本专栏 > Golang > Gin中间件

Go中Gin中间件的实现

作者: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中间件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文