衔接上文,继续开发。这一章的主要目的是热更新服务。

 

实现目标

  • 不关闭现有的服务连接
  • 新进程启动替代旧进程
  • 新进程负责接管新来的请求连接
  • 连接要随时响应用户的请求,当用户仍在访问旧进程时要保持连接。
  • 新用户应当请求新进程。
  • 不可以出现拒绝请求的情况。

 

流程

  1. 替换可执行文件或修改配置文件
  2. 发送信号量 SIGHUP
  3. 拒绝新连接请求旧进程,但要保证已有连接正常
  4. 启动新的子进程
  5. 新的子进程开始Accept
  6. 系统将新的请求转交新的子进程
  7. 旧进程处理完所有旧连接后正常结束

 

解决方案

有两个解决方案:

  1. endless包
  2. http.Server的Shutdown方法(Golang >= 1.8)

endless热更新是采取创建子进程后将原进程退出的方式,这点不符合守护进程的要求。

所以这里我们采用第二种方案:

http.Shutdown 它配合signal.Notify函数监听系统退出信号,完成优雅退出。

Shutdown(ctx) 函数会阻止新的连接进入,并等待活跃连接处理完成后再终止程序。

另外,他同时会监听Context事件,等待Context触发后也会结束进程。

 

Golang 在HTTP服务方面热更新有不少方案,我们应该依据实际场景选最合适的。

【Go】gin Blog项目(六) 热更新HTTP服务
Tagged on:     
5 1 投票
Article Rating
订阅评论
提醒

0 评论
内联反馈
查看所有评论