最近在帮忙基友写一个 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