Golang Go语言中 Web 服务的自动重启方案求问
Golang Go语言中 Web 服务的自动重启方案求问
现在的 Web 服务由于一些 bug,会导致服务宕掉
自动的 recover 中间件等只能处理当前 goroutine 中的 panic,如果每个 goroutine 都要 recover 处理下就太麻烦了,而且也不能有效排除后续维护人员的偷懒或失误
看了一些相关模块,没有太满意的,期望的是像 supervisor 的那样的功能,但是不想用 python 包,也想用更轻量级的方案。
求问大家是怎么解决的。
写个看门狗脚本,例如 kill YourGoService && ./YourGoService 然后 cronjob 定期运行一次
systemd
虚机起就 systemd,容器就 docker --restart=always
docker 吧
systemd
你的 http 框架最好可以支持 HandleChain 这样可以实现一个 recover 的中间件
func HandleRecover(ctx webFrame.Context) {
ctx.Next()
if err := recover();err != nil {
// print err
}
}
然后把这个中间件加在 HandleChain 的第一个 就可以了
router.use(HandleRecover)
最简单的 直接用成熟的 http 框架 比如说 gin 自带 recover
最好的还是 systemd 和 docker
用进程守护就不怕中断服务中断吗?
在方法内部新开的 goroutine panic 是无法被统一的 recover 的。
写一个健康检查的接口。
外部用 systemd 或者 docker 之类的进行健康检查。
service 外面包裹一层自动重启的软件,例如利用 supervisor / pm2 做管理
没细看,lz 是不是对 supervisor 有误解,supervisor 只是用 Python 写的,可以管理任何进程而不是只能管理 python 程序
你进程都崩了,很多信息会丢的,你确定这样没问题吗?
docker+k8s
golang 版 supervisord,不需要 Python 环境,一个二进制文件加配置文件 https://github.com/ochinchina/supervisord
docker 最好用
重启还是要靠系统层面解决,比如内存泄露咋办,这 recover 就没用了,平时每次执行都 if else 一下,其实浪费性能
supervisored 啊,好使~
在Golang中,实现Web服务的自动重启通常涉及监控文件变更、优雅关闭旧进程、启动新进程等步骤。以下是一些推荐的自动重启方案:
-
使用endless库:
- endless库可以替换标准库net/http的ListenAndServe方法,实现服务的优雅重启。
- 当检测到二进制文件更新时,endless会自动关闭旧进程并启动新进程,同时保持原有的请求上下文。
-
自定义监控脚本:
- 编写一个监控脚本,使用fsnotify库监听Web服务二进制文件的变更。
- 当检测到文件变更时,脚本可以执行关闭旧进程、启动新进程的命令。
- 为了确保平滑过渡,可以在重启前设置延迟,以避免因文件未完全上传而导致的启动失败。
-
容器化部署:
- 使用Docker等容器技术部署Go Web服务。
- 通过容器编排工具(如Kubernetes)实现服务的自动更新和重启。
- 这种方法可以简化部署和管理,同时提高服务的可用性和可扩展性。
-
结合CI/CD流程:
- 将自动重启方案集成到持续集成/持续部署(CI/CD)流程中。
- 在代码提交、构建成功后,自动触发部署和重启操作。
综上所述,选择合适的自动重启方案应根据具体的应用场景和需求来决定。在生产环境中,建议采用经过充分测试的方案,并确保其可靠性和稳定性。