该功能提供一种能让应用不中断业务的重启方式,重启服务能让新老进程无缝切换, 实现零停机时间(Zero-Downtime)部署。
相关实现详见:[Graceful Restart in Golang](https://grisha.org/blog/2014/06/03/graceful-restart-in-golang/) / [Gong服务实现平滑重启分析](https://www.cnblogs.com/zhucheer/p/12368301.html)
当前有两种通用的方案来解决:
方案一:多机器部署,可以通过网关/服务注册等工具,将即将重启服务的机器从网关下线,重启完成后再重新上线,该方案适合多机器部署的企业级应用;
方案二:让我们的程序实现自启动机制,重启子进程来实现平滑重启,适合单机器部署应用;
方案一借助外部工具无需框架提供支持,我们这里介绍方案二由框架封装了一个平滑重启的机制;
基于 golang 的 `cmd.ExtraFiles` 方法传递文件描述符实现,目前只支持在 linux 系统下完成平滑重启功能。
## 实现说明
- 监听退出信号;
- 监听到信号后 fork 子进程,使用相同的命令启动程序,将文件描述符传递给子进程;
- 子进程启动后,父进程停止服务并处理正在执行的任务(或超时)退出;
- 此时只有一个新的进程在运行,实现平滑重启。
## 快速使用
向正在运行的程序发送 USR1 信号即实现平滑重启。
```
> kill -USR1 xxx (输入进程的pid)
```