生产环境必须用fiber.new()而非fiber.default(),因后者自动启用logger、recover等中间件导致敏感信息泄露、ttfb增加0.3–0.8ms且高并发下i/o成瓶颈;strictrouting为设计特性,应通过重定向而非关闭来统一路径规范;ctx.next()是否继续执行仅取决于是否已写响应。

生产环境必须用 fiber.New() 初始化,禁用 fiber.Default();StrictRouting 不是 bug,关掉它反而容易引发路由歧义;ctx.Next() 是否继续执行,只取决于你有没有写响应。
为什么 fiber.Default() 绝对不能上生产
fiber.Default() 自动挂载了 Logger、Recover 和 RequestID 中间件,开发阶段图省事没问题,但上线后会直接暴露敏感头(比如 Authorization)、拖慢 TTFB 0.3–0.8ms,高并发下 I/O 成瓶颈。
- 实测在 4 核 8G 环境中,每秒几百条完整请求日志会让 QPS 明显下滑
-
Recover中间件捕获 panic 后仍会打全量堆栈日志,不加过滤等于把内部结构泄露给攻击者 - 所有中间件顺序不可控,比如你想在鉴权后才打日志,但
Default()把 Logger 放最前,根本绕不开
正确做法:用 fiber.New() 起空应用,再按需加中间件——比如只在 error 场景写结构化日志,或对接 zerolog 异步写入。
StrictRouting 导致 /users 和 /users/ 都 404?别关它
Fiber 默认 StrictRouting: true,这是明确设计,不是缺陷。它让 /users 和 /users/ 视为两个独立路径,匹配完全不共享。你只注册了 app.Get("/users", handler),那 GET /users/ 必然 404。
- 全局设
StrictRouting: false后,若同时存在/users和/users/:id,请求/users/123可能被前者匹配,c.Params("id")拿不到值 - 推荐统一重定向:在
app.Use()里加中间件,把结尾带斜杠的路径 301 到无斜杠版本 - 示例代码:
app.Use(func(c fiber.Ctx) error { path := c.Path() if strings.HasSuffix(path, "/") && path != "/" { return c.Redirect(strings.TrimSuffix(path, "/"), 301) } return c.Next() })
上线前务必核对前端 SDK、OpenAPI 文档、Nginx 配置,全部统一用无尾斜杠路径,否则重定向只是兜底,不是替代规范。
ctx.Next() 不往下走?检查是否已写响应
ctx.Next() 不是“执行下一个中间件”的命令,而是把控制权交还给 Fiber 调度器——它是否继续往后跑,只看当前 handler 有没有调过 ctx.Send()、ctx.JSON() 或 ctx.Status(401).Send() 这类写响应的操作。
- 权限中间件里判断失败后写了
ctx.Status(401).SendString("unauthorized"),再跟ctx.Next(),Fiber 直接终止链路,后续 handler 全部跳过 - 拒绝请求就
return,放行才调ctx.Next() - 调试时在每个中间件开头加
log.Println("in auth middleware"),一眼看出执行流卡在哪一层
注意:defer 里的清理逻辑不能依赖 ctx 生命周期,因为 ctx 在请求结束时会被复用,变量可能已失效。
性能关键点:Body 解析、超时、缓冲区
Fiber 的高性能不靠框架名撑着,靠的是避开拷贝、缓存解析、跳过 panic。默认配置下,几个常见操作会直接拉垮 QPS:
-
ctx.Body()触发完整字节拷贝,高吞吐下成瓶颈;改用ctx.BodyBytes()直接取底层 slice -
ctx.Params("id")比strconv.Atoi(ctx.Query("id"))快得多,后者要字符串转换+内存分配 - 别用
context.WithTimeout()控制请求超时——fasthttp 不兼容标准context超时;改用c.Context().SetDeadline() - 启动时加
fiber.Config{DisableStartupMessage: true, EnablePrintRoutes: false},避免启动时打印路由树消耗 CPU -
ReadBufferSize和WriteBufferSize建议设为 4096 或 8192,太小频繁 syscall,太大浪费内存
真正压到百万并发时,瓶颈从来不在框架本身,而在 OS 参数、连接复用策略、业务阻塞点——这些地方没调优,fiber.New() 再干净也没用。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











