iris.App.Shutdown()是同步关闭函数,不自动响应Ctrl+C或kill信号,需手动监听os.Signal并调用;必须配合context.WithTimeout设置超时,避免卡死,且HTTP/2或QUIC服务需额外处理连接生命周期。

iris.App.Shutdown 会阻塞主线程,必须配合信号监听
直接调用 app.Shutdown() 不会自动响应 Ctrl+C 或系统 kill 信号,它只是个同步关闭函数,得你自己注册 os.Signal 并触发。否则进程会卡在 app.Listen() 里,关不掉正在处理的请求,连接可能被粗暴中断。
常见错误现象:按 Ctrl+C 后终端无响应、服务僵死、日志没输出 “Shutting down…”、客户端收到 connection reset。
- 必须用
app.Run()替代app.Listen(),才能接入内置的信号处理器 - 若坚持用
app.Listen(),就得手动监听os.Interrupt和syscall.SIGTERM,再调app.Shutdown() -
app.Run()默认监听os.Interrupt和syscall.SIGTERM,但不会等所有连接空闲才退出 —— 要等,得配超时
Shutdown 超时时间由 ctx.WithTimeout 控制,不是 app 配置项
app.Shutdown() 内部用的是传入的 context.Context,超时逻辑完全由你构造的 context 决定。框架本身不提供类似 WithGracefulTimeout(30 * time.Second) 的配置方法。
性能影响:超时太短(如 1s),长连接(如 SSE、WebSocket)来不及完成响应,会被强制断开;超时太长(如 60s),运维侧等待时间过久,不符合发布流程。
- 正确写法:
ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second),再传给app.Shutdown(ctx) - 错误写法:
app.Shutdown(context.Background())—— 没超时,可能永远卡住 - 别在
app.Run()里改默认行为;想自定义信号处理逻辑,就弃用app.Run(),自己写信号循环
_examples/graceful-shutdown/ 是唯一可直接复用的参考实现
官方示例目录里只有 _examples/graceful-shutdown/ 这一个完整闭环方案,它同时覆盖了 HTTP 服务器和 WebSocket 连接的清理。其他示例(如 monitor、pprof)只做健康检查或调试,不涉及关机逻辑。
容易踩的坑:复制 _examples/routing/ 或 _examples/sessions/ 里的代码,它们压根没关机逻辑,app.Listen() 一跑就停不下来。
- 该示例用
app.Run(iris.Addr(":8080"), iris.WithoutInterruptHandler)关闭默认信号 handler - 然后手动启动 goroutine 监听
os.Interrupt,触发带超时的app.Shutdown() - 关键点:它在
Shutdown()前调用了app.Adapt(iris.WithConfiguration(iris.Configuration{DisableStartupLog: true}))避免日志干扰 shutdown 流程
HTTP/2 和 QUIC 服务关机需额外注意连接复用
启用 iris.WithTLS 或 iris.WithQUIC 后,底层连接是长生命周期的,Shutdown() 默认只等活跃请求结束,不主动驱逐空闲连接。这会导致关机延迟远超预期,尤其在高并发低频请求场景下。
兼容性影响:Go 1.25+ 对 QUIC 的 http.Server.Close() 支持仍不完善,Iris v12.2.0 未做额外封装,得自己调 http.Server.Close() 或降级用 TLS。
- 建议:HTTP/2 服务务必设置
http.Server.IdleTimeout(通过iris.WithServer注入),例如 30 秒 - QUIC 服务暂不推荐用于生产关机场景;如必须用,关机前先调
app.Server().Close()强制终止 - 别依赖
app.Shutdown()自动处理所有传输层状态;它只管应用层路由和中间件生命周期
真正难的不是写 shutdown 代码,而是判断“哪些连接该等、哪些该砍”。比如 WebSocket 心跳包还在发,但业务数据已停,这时候等还是不等?Iris 不替你决策,它只提供 Shutdown() 这个钩子 —— 具体策略得你根据协议特征和业务 SLA 来定。


















