1、如何实现优雅地重启一个Go网络程序呢。主要要解决两个问题:
进程重启不需要关闭监听的端口
既有请求应当完全处理或者超时
2、怎么实现无缝重启
1 .不关闭现有连接,正在运行中的程序
2 .新的进程启动并替代旧的进程
3 .新的进程接管新的连接
4 .连接要随时响应用户的请求,当用户仍在请求旧进程时要保持连接,新用户因该请求新进程
5 不能出现请求被拒绝的时候
3、实现步骤:
err := endless.ListenAndServe("localhost:4242", mux)
只需替换 http.ListenAndServe
和 http.ListenAndServeTLS
。
它会监听这些信号: syscall.SIGHUP, syscall.SIGUSR1, syscall.SIGUSR2, syscall.SIGINT, syscall.SIGTERM, 和syscall.SIGTSTP。
此文章提到的思路是:
(1)通过exec.Command fork一个新的进程,同时继承当前进程的打开的文件(输入输出,socket等)
file := netListener.File() // this returns a Dup()
path