Это 14-й день моего участия в августовском испытании обновлений.Подробности о мероприятии:Испытание августовского обновления
Промежуточное программное обеспечение является очень важным понятием в Golang.Подобно перехватчикам в Java, оно часто используется для улучшения масштабируемости приложений и оставляет больше места для расширения, такого как ведение журнала, обработка ошибок и другие функции.
Во всей реализации Gin промежуточное ПО является сущностью Gin. Каждое промежуточное ПО формирует цепочку промежуточного ПО, перехватывает запросы HTTP-запросов, реализует развязку и разделение кода, причем промежуточное ПО не знает друг о друге, каждому промежуточному ПО нужно заниматься только тем, с чем ему нужно иметь дело.
Обзор промежуточного программного обеспечения Gin
В исходном примере мы напрямую передалиgin.Default()
для инициализации объекта gin, который содержит промежуточное ПО по умолчанию*Engine
.
Среди них функция Default () по умолчанию связывает два подготовленных промежуточных программного обеспечения, это Logger и Recovery, которые помогают нам печатать вывод журнала и обработку боли.
// Default returns an Engine instance with the Logger and Recovery middleware already attached.
func Default() *Engine {
debugPrintWARNINGDefault()
engine := New()
engine.Use(Logger(), Recovery())
return engine
}
Из приведенной выше функции Default() мы видим, что промежуточное ПО Gin устанавливается с помощью метода Use, который представляет собой переменный параметр, который может одновременно устанавливать несколько промежуточных программ.
// Use attaches a global middleware to the router. ie. the middleware attached though Use() will be
// included in the handlers chain for every single request. Even 404, 405, static files...
// For example, this is the right place for a logger or error management middleware.
func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes {
engine.RouterGroup.Use(middleware...)
engine.rebuild404Handlers()
engine.rebuild405Handlers()
return engine
}
Глядя на это, легко понять, что промежуточное программное обеспечение Gin на самом деле является функциональной функцией, определенной Gin, и тип возвращаемого значения этой функции:HandlerFunc
.
Реализация промежуточного программного обеспечения
Промежуточное программное обеспечение в основном используется для выполнения некоторых общих функций, что удобно для расширения функций и унифицированной реализации, аналогичной фильтру.
Из приведенного выше введения для реализации промежуточного программного обеспечения вам нужно только выполнить следующие два пункта:
- это функция
- Тип возвращаемого значения функции должен быть
HandlerFunc
Реализация вычисляет время, необходимое для выполнения каждого запроса.
package main
import (
"fmt"
"time"
"github.com/gin-gonic/gin"
)
func main() {
// 初始化gin对象
route := gin.Default()
// 中间件注册
route.Use(costTimeMiddleware())
// 设置一个get请求,其URL为/hello,并实现简单的响应
route.GET("/hello", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "hello world!",
})
})
// 启动服务
route.Run()
}
func costTimeMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// 请求前获取当前时间
nowTime := time.Now()
// 请求处理
c.Next()
// 请求处理完获取花费的时间
costTime := time.Since(nowTime)
requestURL := c.Request.URL.String()
fmt.Printf("the request URL %s cost %v\n", requestURL, costTime)
}
}
Среди них c.Next() разрешено использовать только в функциях промежуточного программного обеспечения для приостановки обработки бизнес-логики запроса. Чтобы лучше понять выполнение функций промежуточного программного обеспечения, функции промежуточного программного обеспечения можно разделить на три уровня:
По месту регистрации ПО промежуточного слоя делится на:
-
глобальное промежуточное ПО: все запросы проходят через это промежуточное ПО. Например, приведенный выше пример относится к глобальному промежуточному программному обеспечению.
-
локальное промежуточное ПО: Действительно только для зарегистрированных маршрутов. Если промежуточное ПО
costTimeMiddleware
Если он зарегистрирован в следующем месте, он принадлежит локальному промежуточному ПО и действует только для запроса /hello.route.GET("/hello", costTimeMiddleware(), func(c *gin.Context) { c.JSON(200, gin.H{ "message": "hello world!", }) })
Общее промежуточное ПО
Вы можете обратиться к:contrib, который содержит много часто используемого промежуточного программного обеспечения.