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 官方的文档,包含了常见的介绍。