X-Request-ID
在 HTTP Headers 中是一种非标准响应字段,通常用于关联客户端和服务器之间的 HTTP 请求。 Hertz 也提供了可以对 X-Request-ID
进行操作的 Request ID 中间件。
- 主要用途:Hertz 提供了 requestid 中间件以及内置的 hlog 日志库与一些 hlog 日志组件的扩展 ,本文主要讲解如何将请求ID与日志关联方便用户查找日志。
- 主要作用:它的主要作用是在请求的响应和
context
中添加rquestid
,用于唯一标识一次请求。
案例:
package main
import (
"context"
"github.com/cloudwego/hertz/pkg/app"
"github.com/cloudwego/hertz/pkg/app/server"
"github.com/cloudwego/hertz/pkg/common/hlog"
"github.com/cloudwego/hertz/pkg/common/utils"
"github.com/cloudwego/hertz/pkg/protocol/consts"
"github.com/hertz-contrib/requestid"
)
func main() {
h := server.Default()
h.Use(
// 自定义 request id 生成逻辑
requestid.New(
requestid.WithGenerator(func(ctx context.Context, c *app.RequestContext) string {
return "cloudwego.io"
}),
// 自定义 request id 响应头键值
requestid.WithCustomHeaderStrKey("Your-Customised-Key"),
),
)
// Example ping request.
h.GET("/ping", func(ctx context.Context, c *app.RequestContext) {
hlog.Info(string(c.Response.Header.Header()))
c.JSON(consts.StatusOK, utils.H{"ping": "pong"})
})
h.Spin()
}
访问 127.0.0.1:8888/ping
,我们会发现响应头中多出了一个 X-request-ID:cloudwego.io
字段。并且将响应头信息记录为日志(这里假设 hlog
是日志记录库的实例)
- 具体解读:
这段代码展示了使用 cloudwego.io
作为自定义 Request ID 生成器,并将生成的 Request ID 设置到响应头中的自定义键名 Your-Customised-Key
中。
以下是对这段代码的解释:
首先,在 h.Use()
中调用了 requestid.New
方法,它返回一个中间件函数对象。该中间件函数用于为每个请求生成唯一的 Request ID,并将其设置到上下文中。
在 requestid.New
的参数中,我们传入了两个选项:
- 使用了
WithGenerator
方法,指定了一个自定义的 Request ID 生成函数。该函数接收一个上下文对象和请求上下文c
,并返回一个字符串作为生成的 Request ID。在这个例子中,生成的 Request ID 固定为 "cloudwego.io",也可以根据实际需求自定义其他生成逻辑。 - 使用了
WithCustomHeaderStrKey
方法,指定了一个自定义的请求头键名。生成的 Request ID 将被设置到该键名对应的请求头中。在这个例子中,自定义的键名为 "Your-Customised-Key",你可以根据实际需求自定义其他请求头键名。
接下来,在 h.GET("/ping", ...)
中定义了一个简单的 Ping 请求处理函数。该处理函数使用 c.Response.Header
对象来访问响应头,并使用 hlog.Info
将响应头信息记录为日志(这里假设 hlog
是日志记录库的实例)。然后,使用 c.JSON
方法将包含 "ping": "pong" 的 JSON 响应发送回客户端。
总结来说,这段代码的功能是:
- 创建一个自定义的 Request ID 生成器,并将生成的 Request ID 设置到响应头中的自定义键名中。
- 定义一个处理 Ping 请求的函数,并在响应中返回一个包含 "ping": "pong" 的 JSON。