skip to content

优雅重启 Gin 服务器

通过 Endless 库实现优雅重启 Gin 服务器

最近在帮忙基友写一个 Go 消息聚合机器人平台,在 Go 语言上如果我们更新了代码,那只能重新编译以后重启服务器,但是如果粗暴的重启,那么很有可能会导致正在处理的请求被中断,这样就会导致用户体验不好。

所以,我们在这个地方使用 Endless 库来处理这个问题。要使用这个库,我们只需要这么做就行了

router := gin.Default()
router.GET("/", handler)
// [...]
endless.ListenAndServe(":4242", router)

这样,假如我们的源代码更新了,将编译好的程序推送到服务器上(路径要保持一致),然后执行 kill -1 <pid> 就可以优雅的重启服务器了。服务器在接收到这个 kill -1 信号以后,会自动创建一个新的子进程来执行新编译好的程序,然后在子进程中关闭老进程的监听 socket。在子进程中开始监听端口。

在关闭老进程的监听 socket 以后,老进程可以继续处理一段时间之前的数据 socket,保证之前连接的用户能继续通信。再一段时间后程序退出。

具体原理可以看这篇文章 https://www.luozhiyun.com/archives/584