Iris 默认不带RequestID中间件因其“显式优于隐式”设计哲学,所有上下文增强需手动注册;需自定义中间件生成ID、设Header与ctx.Values()后调用ctx.Next()。

为什么 Iris 默认不带 RequestID 中间件
Iris 的 iris.Application 没有内置全局 RequestID 注入,不像 Gin 有 gin.Default() 自动挂载 gin.Recovery() 和 gin.Logger(),也不像 GoFrame 提供 gf.RequestID() 这类开箱即用的中间件。它的设计哲学偏向“显式优于隐式”,所有上下文增强都得手动注册。如果你直接跑 app.Get("/api/user", handler),ctx.Request().Header.Get("X-Request-ID") 拿到的永远是空字符串。
用 iris.AddMiddleware 手动注入 RequestID
最轻量、最可控的方式是自己写一个中间件函数,在请求进入时生成并注入 ID。Iris 的中间件签名是 func(ctx iris.Context),你可以用标准库 crypto/rand 或第三方如 github.com/google/uuid:
import "github.com/google/uuid"
func RequestID() iris.Handler {
return func(ctx iris.Context) {
id := uuid.New().String()
ctx.Header("X-Request-ID", id)
ctx.Values().Set("request_id", id) // 存入 context.Values() 供 handler 使用
ctx.Next()
}
}
// 注册到全局
app.Use(RequestID())
注意两点:
• 不要用 ctx.ResponseWriter().Header().Set(),Iris 的 ctx.Header() 才是正确写法;
• ctx.Values().Set() 是线程安全的,比往 ctx.Request().Context() 里塞值更符合 Iris 的数据流习惯。
如何让 RequestID 贯穿整个调用链(含下游 HTTP 请求)
如果 handler 内部要调用其他服务(比如调用 OpenAI 兼容接口做 Search Agent 规划),必须把当前 RequestID 透传过去,否则链路就断了。常见错误是只在响应头写,但没往下游请求头里带:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 下游是 HTTP 服务:在发起
http.NewRequest前,从ctx.Values().Get("request_id")取出 ID,加到req.Header.Set("X-Request-ID", id) - 下游是 gRPC:用
metadata.Pairs("x-request-id", id)包装 context - 日志打点时统一取
ctx.Values().GetString("request_id"),别混用ctx.GetHeader("X-Request-ID")—— 后者可能被客户端伪造
如果你用的是 TaoToken 的 OpenAI 兼容入口做 Search Agent 评测,这一步尤其关键:只有 RequestID 对齐,才能把 chat.completions.create 的 usage 日志和 TaoToken 后台的请求记录串起来,否则“谁在哪个阶段消耗了多少 Token”根本没法归因。
别踩 ctx.Next() 位置的坑
RequestID 中间件里漏掉 ctx.Next(),会导致后续 handler 完全不执行;但把它放在 ctx.Header() 设置之前,又会导致下游服务收不到 ID。典型错误写法:
// ❌ 错误:Next() 在 Header 之前,下游看不到 header
func BadRequestID() iris.Handler {
return func(ctx iris.Context) {
ctx.Next() // handler 先跑了,header 还没设
ctx.Header("X-Request-ID", uuid.New().String())
}
}
正确顺序永远是:生成 ID → 写 header → 写 ctx.Values() → ctx.Next()。这个顺序一旦错乱,链路追踪就会在第一跳就失效。


















