在 Gin 框架中添加网关中间件是一种常见的做法,可以用于实现请求的预处理、身份验证、日志记录等功能。下面是一个简单的示例,演示如何在 Gin 框架中添加一个简单的网关中间件。
package main
import (
"fmt"
"net/http"
"time"
"github.com/gin-gonic/gin"
)
// 网关中间件
func GatewayMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// 在这里可以进行各种预处理操作,比如身份验证、日志记录等
// 记录请求开始时间
start := time.Now()
// 执行下一个中间件或者处理器
c.Next()
// 记录请求结束时间
end := time.Now()
latency := end.Sub(start)
// 打印请求信息
fmt.Printf("[%s] %s %s %s %d %v\n",
end.Format("2006-01-02 15:04:05"),
c.Request.Method,
c.Request.URL.Path,
c.ClientIP(),
c.Writer.Status(),
latency,
)
}
}
func main() {
// 创建一个 Gin 引擎
r := gin.Default()
// 添加网关中间件
r.Use(GatewayMiddleware())
// 定义一个简单的路由
r.GET("/ping", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"message": "pong"})
})
// 启动服务
if err := r.Run(":8080"); err != nil {
fmt.Println("Server startup failed:", err)
}
}
在上面的示例中,我们首先定义了一个 GatewayMiddleware
函数,它返回一个 gin.HandlerFunc
类型的函数,这个函数就是我们的网关中间件。在这个中间件中,我们可以进行一些预处理操作,比如记录请求开始时间、身份验证等。然后,我们通过 r.Use()
方法将这个中间件添加到 Gin 引擎中。
接着,我们定义了一个简单的路由 /ping
,当客户端发送 GET 请求到 /ping
路径时,会返回一个 JSON 格式的响应。在这个路由处理函数中,我们并没有进行任何额外的操作,但是由于我们已经在引擎中添加了网关中间件,所以这个请求也会经过网关中间件的处理。
最后,我们通过 r.Run(":8080")
启动了一个 HTTP 服务,监听在 8080 端口上。当有请求到达时,Gin 框架会自动调用注册的路由处理函数,并经过添加的中间件处理。