前言

我们编写的Web项目部署之后,经常会因为需要进行配置变更或功能迭代而重启服务,单纯的kill -9 pid的方式会强制关闭进程,这样就会导致服务端当前正在处理的请求失败,那有没有更优雅的方式来实现关机或重启呢?

阅读本文需要了解一些UNIX系统中信号的概念,请提前查阅资料预习。

优雅地关机

什么是优雅关机?

Ctrl+C

如何实现优雅关机?

Go 1.8版本之后, http.Server 内置的 Shutdown() 方法就支持优雅地关机,具体示例如下:

如何验证优雅关机的效果呢?

/

我们按下Ctrl+C时会发送syscall.SIGINT来通知程序优雅关机,具体做法如下:

Ctrl+Csyscall.SIGINT

优雅地重启

优雅关机实现了,那么该如何实现优雅重启呢?

ListenAndServe

如何验证优雅重启的效果呢?

kill -1 pidsyscall.SIGINT
hello gin!hello q1mi!hello gin!hello q1mi!
endlessforksupervisor

总结

无论是优雅关机还是优雅重启归根结底都是通过监听特定系统信号,然后执行一定的逻辑处理保障当前系统正在处理的请求被正常处理后再关闭当前进程。使用优雅关机还是使用优雅重启以及怎么实现,这就需要根据项目实际情况来决定了。