GoLang Echo 中间件

2015-10-06 language golang network

Echo 中间件指的是可以拦截 http 请求的特殊函数,在请求和响应中间可以注册多个中间件,每个中间件执行不同的功能,一个中间执行完再轮到下一个中间件执行。

简介

中间件是一个函数,嵌入在 HTTP 的请求和响应之间,可以获得 Echo#Context 对象用来进行一些特殊的操作,当所有中间件调用完之后再调用用户定义函数,常见的如记录每个请求或者统计请求数。

可以通过 Pre() 定义在路由前,最常见的如 HTTPS 的重定向、URL 重写等,还可以通过 Use() 定义在路由之后,同时允许对路由组,单个路由分别设置。

同时可以在满足某些条件时跳过,例如如下的设置。

e := echo.New()
e.Use(middleware.LoggerWithConfig(middleware.LoggerConfig{
    Skipper: func(c echo.Context) bool {
        if strings.HasPrefix(c.Request().Host, "localhost") {
            return true
        }
            return false
    },
}))

官方

Recover

用来捕获 Panic 错误,同时可以选择打印对应的堆栈。

e.Use(middleware.RecoverWithConfig(middleware.RecoverConfig{
    Skipper:           DefaultSkipper,
    StackSize:         4 << 10, // 4 KB
    DisableStackAll:   false,
    DisablePrintStack: false,
    LogLevel:          log.ERROR,
    LogErrorFunc:      nil,
}))

RequestID

用来为请求生成唯一的请求 ID 信息,如果在请求的头 X-Request-ID 已经指定,那么就可以直接使用,否则生成。

e.Use(middleware.RequestIDWithConfig(middleware.RequestIDConfig{
    Skipper:      DefaultSkipper,
    TargetHeader: echo.HeaderXRequestID,
    Generator: func() string {
        return customGenerator()
    },
}))

日志

内部提供了日志配置,例如可以通过如下方式配置。

e := echo.New()
e.Logger.SetHeader("${time_rfc3339} ${level} ${prefix}-${short_file}:${line}")
e.Logger.SetPrefix("login")
e.Logger.SetLevel(config.Conf.LogLevel)
e.Use(mw.LoggerWithConfig(mw.LoggerConfig{
	Format: "${time_rfc3339} REQ ${method} ${remote_ip} ${host} ${uri} ${status} ${latency}\n",
}))

参考

  • Echo Docs 官方的文档,包含了常见的介绍。