GO初学:与Gin 中间件 的相遇

36 阅读2分钟

概念

在翻阅Gin的使用资料时,总能看到“中间件”这个概念,中间件是什么?

在Go中,中间件是指在web服务中,对请求的预处理和后置处理;被称为“中间件”,是因为它位于 Go 网络服务器和实际处理程序之间。

中间件的作用

如果想在每次请求前后执行一些代码,例如,如果想记录对服务器发出的所有请求,或者允许所有 API 都可以跨源调用,或者确保当前用户在调用安全资源的处理程序之前已经过身份验证...这些都可以用中间件完成。

中间件不是Gin特有的概念,而是Go web服务的概念。

Gin中的中间件

Gin中使用中间件:router.Use(...)

Recovery

Recovery的作用是可以在任何panic中恢复过来并返回500。

// Recovery returns a middleware that recovers from any panics and writes a 500 if there was one.
func Recovery() HandlerFunc {
	return RecoveryWithWriter(DefaultErrorWriter)
}

也就是说,当程序里有些异常情况没考虑到的时候,程序就panic退出了,服务就会停止,用了recovery中间件,遇到panic服务也不会退出,而是返回500;

Gin默认的启动方式是r := gin.Default()其中包含 Logger、Recovery 中间件

image.png

如果想自己添加的话,也可以这样:router.Use(gin.Recovery())

Logger

顾名思义,记录日志的中间件; 处理请求时,会看到有日志打印到控制台;

Logger 中间件将日志写入 gin.DefaultWriter,默认的gin.DefaultWriter = os.Stdout

image.png

将日志记录到文件

// 禁用控制台颜色,将日志写入文件时不需要控制台颜色。
gin.DisableConsoleColor()
// 创建日志文件
f, _ := os.Create("gin.log")
gin.DefaultWriter = io.MultiWriter(f)
router := gin.Default()

如果需要同时将日志写入文件和控制台,需要这样写:

gin.DefaultWriter = io.MultiWriter(f, os.Stdout)

image.png

自定义日志的格式

根据Default()的代码可以知道,这里的日志分两部分:debugPrintWARNINGDefault()和中间件Logger(); 按照我的理解,debugPrintWARNINGDefault 是服务启动时的日志;Logger()记录客户端对服务器发送的每一次请求;

  • 修改debugPrintWARNINGDefault()的格式:
router := gin.Default()
gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) {
    log.Printf("endpoint %v %v %v %v\n", httpMethod, absolutePath, handlerName, nuHandlers)
}
  • 修改访问日志 需要创建一个不包含中间件的路由
router := gin.New()
  • 再添加自定义的日志中间件
router.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string {
    // 自定义格式
    return fmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %s\"\n",
        param.ClientIP,
        param.TimeStamp.Format(time.RFC1123),
        param.Method,
        param.Path,
        param.Request.Proto,
        param.StatusCode,
        param.Latency,
        param.Request.UserAgent(),
        param.ErrorMessage,
    )
}))

以上就是中间件的简单了解,期待下次相遇。