该功能提供一种能让应用不中断业务的重启方式,重启服务能让新老进程无缝切换, 实现零停机时间(Zero-Downtime)部署。 相关实现详见:Graceful Restart in Golang / Gong服务实现平滑重启分析

当前有两种通用的方案来解决: 方案一:多机器部署,可以通过网关/服务注册等工具,将即将重启服务的机器从网关下线,重启完成后再重新上线,该方案适合多机器部署的企业级应用; 方案二:让我们的程序实现自启动机制,重启子进程来实现平滑重启,适合单机器部署应用;

方案一借助外部工具无需框架提供支持,我们这里介绍方案二由框架封装了一个平滑重启的机制; 基于 golang 的 cmd.ExtraFiles 方法传递文件描述符实现,目前只支持在 linux 系统下完成平滑重启功能。

# 实现说明

  • 监听退出信号;
  • 监听到信号后 fork 子进程,使用相同的命令启动程序,将文件描述符传递给子进程;
  • 子进程启动后,父进程停止服务并处理正在执行的任务(或超时)退出;
  • 此时只有一个新的进程在运行,实现平滑重启。

# 快速使用

向正在运行的程序发送 USR1 信号即实现平滑重启。

> kill -USR1 xxx  (输入进程的pid)