生产环境必须用 fiber.New() 而非 fiber.Default(),因后者自动启用 Logger 等中间件导致日志爆炸、TTFB 增加、I/O 拖垮 QPS;StrictRouting 需显式处理尾斜杠;c.Params/c.QueryParam/c.FormValue 来源不同不可混用;路由注册须在 Listen 前完成,运行时增删会 panic。

生产环境必须用 fiber.New() 而非 fiber.Default()
上线还用 fiber.Default(),等于每秒打几百条含 Authorization 的完整请求日志,TTFB 多 0.3–0.8ms,高并发下 I/O 直接拖垮 QPS。这不是框架慢,是初始化错了。
-
fiber.Default()是开发快捷入口,自动挂了Logger、Recover、RequestID—— 适合本地验证逻辑,但绝不该进生产 -
fiber.New()是空应用,什么中间件都没有;上线前必须用它,再按需加:比如只在出错时记日志,或只对/api/*加鉴权 - 真要结构化日志,别用
fiber.Logger(),改用采样式记录或对接zerolog/zap,避免日志写满磁盘或阻塞响应
StrictRouting 导致 /users 和 /users/ 404 怎么办
Fiber 默认开启 StrictRouting: true,把两者视为完全不同的路径。你只注册了 app.Get("/users", handler),那访问 /users/ 就必然 404 —— 这不是 bug,是匹配规则没对齐。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 别无脑关掉:
fiber.New(&fiber.Config{StrictRouting: false})会让/users/123被/users匹配,c.Params("id")拿不到值 - 推荐显式注册两条路由:
app.Get("/users", handler)和app.Get("/users/", redirectHandler) - 或加统一重定向中间件:
if strings.HasSuffix(c.Path(), "/") && c.Path() != "/" { c.Redirect(strings.TrimSuffix(c.Path(), "/"), 301) } - 上线前确认前端、SDK、OpenAPI 文档全用无尾斜杠路径,避免反复跳转
c.QueryParam、c.Params、c.FormValue 到底读哪来的值
三者来源完全不同,混用必空。URL 是 /user/123?format=json,那:
-
c.Params("id")只读路由占位符,来自app.Get("/user/:id", )匹配后的123 -
c.QueryParam("format")只读 query string,即?format=json中的json -
c.FormValue("name")是给application/x-www-form-urlencoded准备的;JSON body 必须用c.Body()+json.Unmarshal或c.Struct(&v) -
c.QueryParam("id")→ 空(query string 里没id=xxx);c.Params("format")→ 空(路径里没声明:format)
运行时动态增删路由会 panic 或静默失效
Fiber 的 Radix 树启动后冻结,app.Get() 等调用在 app.Listen() 后执行,会引发 concurrent map writes panic,或新增路由根本不会生效 —— 因为 fasthttp server 实例一旦运行,就不会重新扫描路由表。
- 误以为关掉
StrictRouting就能“随时改路径”,结果只是让斜杠匹配宽松了,和动态性无关 - 真正需要动态行为(如按租户加载不同路由),得靠预注册 + 运行时分支判断:
app.Any("/api/:tenant/:service/*", dispatchHandler) - 在
dispatchHandler里解析c.Params("tenant")查配置表,再调用对应服务函数;用c.Locals存租户元数据,安全且线程隔离 - 若需热更新配置,用
sync.Map或atomic.Value管理映射表,只读取不改树


















