🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
该功能提供一种能让应用不中断业务的重启方式,重启服务能让新老进程无缝切换, 实现零停机时间(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) ```