該功能提供一種能讓應用不中斷業務的重啟方式,重啟服務能讓新老進程無縫切換, 實現零停機時間(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)
```