Golang Go语言中 Web 服务的自动重启方案求问

发布于 1周前 作者 yuanlaile 来自 Go语言

Golang Go语言中 Web 服务的自动重启方案求问
现在的 Web 服务由于一些 bug,会导致服务宕掉

自动的 recover 中间件等只能处理当前 goroutine 中的 panic,如果每个 goroutine 都要 recover 处理下就太麻烦了,而且也不能有效排除后续维护人员的偷懒或失误

看了一些相关模块,没有太满意的,期望的是像 supervisor 的那样的功能,但是不想用 python 包,也想用更轻量级的方案。

求问大家是怎么解决的。

22 回复

docker

更多关于Golang Go语言中 Web 服务的自动重启方案求问的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


写个看门狗脚本,例如 kill YourGoService && ./YourGoService 然后 cronjob 定期运行一次

不可能用 supervisor 吗

虚机起就 systemd,容器就 docker --restart=always

你的 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

没用的,go 里面开启一个新的协程就得重新捕获,不然整个程序就会 crash 。而且你这个写的也不对,ctx.next()应该放在 recover 后面,而且还有放到 defer 里。不然 ctx.next()先执行,里面有 panic 你的程序就 crash 了

用进程守护就不怕中断服务中断吗?

在方法内部新开的 goroutine panic 是无法被统一的 recover 的。

写一个健康检查的接口。
外部用 systemd 或者 docker 之类的进行健康检查。

service 外面包裹一层自动重启的软件,例如利用 supervisor / pm2 做管理

没细看,lz 是不是对 supervisor 有误解,supervisor 只是用 Python 写的,可以管理任何进程而不是只能管理 python 程序

你进程都崩了,很多信息会丢的,你确定这样没问题吗?

golang 版 supervisord,不需要 Python 环境,一个二进制文件加配置文件 https://github.com/ochinchina/supervisord

docker 最好用

重启还是要靠系统层面解决,比如内存泄露咋办,这 recover 就没用了,平时每次执行都 if else 一下,其实浪费性能

supervisored 啊,好使~

在Golang中,实现Web服务的自动重启通常涉及监控文件变更、优雅关闭旧进程、启动新进程等步骤。以下是一些推荐的自动重启方案:

  1. 使用endless库

    • endless库可以替换标准库net/http的ListenAndServe方法,实现服务的优雅重启。
    • 当检测到二进制文件更新时,endless会自动关闭旧进程并启动新进程,同时保持原有的请求上下文。
  2. 自定义监控脚本

    • 编写一个监控脚本,使用fsnotify库监听Web服务二进制文件的变更。
    • 当检测到文件变更时,脚本可以执行关闭旧进程、启动新进程的命令。
    • 为了确保平滑过渡,可以在重启前设置延迟,以避免因文件未完全上传而导致的启动失败。
  3. 容器化部署

    • 使用Docker等容器技术部署Go Web服务。
    • 通过容器编排工具(如Kubernetes)实现服务的自动更新和重启。
    • 这种方法可以简化部署和管理,同时提高服务的可用性和可扩展性。
  4. 结合CI/CD流程

    • 将自动重启方案集成到持续集成/持续部署(CI/CD)流程中。
    • 在代码提交、构建成功后,自动触发部署和重启操作。

综上所述,选择合适的自动重启方案应根据具体的应用场景和需求来决定。在生产环境中,建议采用经过充分测试的方案,并确保其可靠性和稳定性。

回到顶部