衔接上文,继续开发。这一章的主要目的是热更新服务。
实现目标
- 不关闭现有的服务连接
- 新进程启动替代旧进程
- 新进程负责接管新来的请求连接
- 连接要随时响应用户的请求,当用户仍在访问旧进程时要保持连接。
- 新用户应当请求新进程。
- 不可以出现拒绝请求的情况。
流程
- 替换可执行文件或修改配置文件
- 发送信号量 SIGHUP
- 拒绝新连接请求旧进程,但要保证已有连接正常
- 启动新的子进程
- 新的子进程开始Accept
- 系统将新的请求转交新的子进程
- 旧进程处理完所有旧连接后正常结束
解决方案
有两个解决方案:
- endless包
- http.Server的Shutdown方法(Golang >= 1.8)
endless热更新是采取创建子进程后将原进程退出的方式,这点不符合守护进程的要求。
所以这里我们采用第二种方案:
http.Shutdown 它配合signal.Notify函数监听系统退出信号,完成优雅退出。
Shutdown(ctx) 函数会阻止新的连接进入,并等待活跃连接处理完成后再终止程序。
另外,他同时会监听Context事件,等待Context触发后也会结束进程。
Golang 在HTTP服务方面热更新有不少方案,我们应该依据实际场景选最合适的。