我们编写的Web项目部署之后,经常会因为需要进行配置变更或功能迭代而重启服务,单纯的kill -9 pid
的方式会强制关闭进程,这样就会导致服务端当前正在处理的请求失败,那有没有更优雅的方式来实现关机或重启呢?
阅读本文需要了解一些UNIX系统中
信号
的概念,请提前查阅资料预习。
优雅地关机
什么是优雅关机?
优雅关机就是服务端关机命令发出后不是立即关机,而是等待当前还在处理的请求全部处理完毕后再退出程序,是一种对客户端友好的关机方式。而执行Ctrl+C
关闭服务端时,会强制结束进程导致正在访问的请求出现问题。
如何实现优雅关机?
Go 1.8版本之后, http.Server 内置的 Shutdown()[1] 方法就支持优雅地关机,具体示例如下:
// +build go1.8package mainimport ( "context" "log" "net/http" "os" "os/signal" "syscall" "time" "github.com/gin-gonic/gin")func main() {
router := gin.Default() router.G