Go iris框架支持优雅退出,实际业务场景我们想重启/关闭web应用的时候,如果直接强制关闭Go进程,很容易出现有些业务处理一半,没有处理完成就被干掉,导致业务异常,比较好的做法的是先不接收新的请求,让正在处理请求,处理完成,然后再退出Go进程。
你可以使用几种方法来执行优雅关机或重启。也可以使用专门为此构建的第三方软件包,也可以使用 app.Shutdown(context.Context) 方法。
使用 iris.RegisterOnInterrupt 注册 CTRL/CMD+C 事件:
idleConnsClosed := make(chan struct{})
iris.RegisterOnInterrupt(func() {
timeout := 10 * time.Second
ctx, cancel := stdContext.WithTimeout(stdContext.Background(), timeout)
defer cancel()
// close all hosts.
app.Shutdown(ctx)
close(idleConnsClosed)
})
// [...]
app.Listen(":8080", iris.WithoutInterruptHandler, iris.WithoutServerError(iris.ErrServerClosed))
<-idleConnsClosed