goang 重启很简单 ,kill 进程pid ,然后重启,但是可能有以下问题:
1 如果程序准备写入数据库,这时kill程序,导致写入失败,数据不完整,或者中断用户请求。
2 程序重启的短暂时间,无法提供服务
endless 包
endless 包就是解决上面重启产生的问题的,不过只能用在web server,只能在linux上使用
golang 应用需要编译为相同的可以执行文件,新的可执行文件覆盖旧的可执行文件,然后执行kill -1 pid,就会平滑重启了。
整体流程分析
1 启动程序,提供服务 ,监听kill 信号
2 父进程收到kill信号,fork 父进程,复用父进程的listener ,创建子进程,子进程接管新请求。
3 子进程启动后,给父进程发送kill 信号,父进程收到kill信号,开始关闭 父进程的listener ,处理父进程所有已经建立的请求,然后关闭建立的请求,处理完后关闭连接,父进程退出。
使用实例
r := gin.New()
r.GET("/", func(c *gin.Context) {
c.String(200, config.Config.Server.AppId)
})
s := endless.NewServer(":8000", r)
err := s.ListenAndServe()
if err != nil {
log.Printf("server err: %v", err)
}