V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
ksedz
V2EX  ›  Go 编程语言

求问 Golang Web 服务的自动重启方案

  •  
  •   ksedz · 2020-10-29 15:29:16 +08:00 · 3028 次点击
    这是一个创建于 1515 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在的 Web 服务由于一些 bug,会导致服务宕掉

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

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

    求问大家是怎么解决的。
    第 1 条附言  ·  2020-10-30 21:19:51 +08:00
    感谢各位的建议,目前生产环境不是 docker,这个方案不能用了。

    go 版本的 supervisor 是我最初希望的答案,不过现在看来,systemd 才是正途。
    21 条回复    2020-11-27 18:04:26 +08:00
    susecjh
        1
    susecjh  
       2020-10-29 15:32:13 +08:00
    docker
    DoctorCat
        2
    DoctorCat  
       2020-10-29 15:40:13 +08:00
    写个看门狗脚本,例如 kill YourGoService && ./YourGoService 然后 cronjob 定期运行一次
    Maboroshii
        3
    Maboroshii  
       2020-10-29 15:40:57 +08:00   ❤️ 1
    systemd
    meshell
        4
    meshell  
       2020-10-29 15:43:41 +08:00
    不可能用 supervisor 吗
    676529483
        5
    676529483  
       2020-10-29 16:50:36 +08:00
    虚机起就 systemd,容器就 docker --restart=always
    coderxy
        6
    coderxy  
       2020-10-29 16:52:01 +08:00
    docker 吧
    wellsc
        7
    wellsc  
       2020-10-29 16:54:18 +08:00
    systemd
    zunceng
        8
    zunceng  
       2020-10-29 17:32:52 +08:00
    你的 http 框架最好可以支持 HandleChain 这样可以实现一个 recover 的中间件

    func HandleRecover(ctx webFrame.Context) {
    ctx.Next()
    if err := recover();err != nil {
    // print err
    }
    }

    然后把这个中间件加在 HandleChain 的第一个 就可以了

    router.use(HandleRecover)

    最简单的 直接用成熟的 http 框架 比如说 gin 自带 recover
    dongisking
        9
    dongisking  
       2020-10-29 17:36:35 +08:00
    最好的还是 systemd 和 docker
    coderxy
        10
    coderxy  
       2020-10-29 17:40:16 +08:00
    @zunceng 没用的,go 里面开启一个新的协程就得重新捕获,不然整个程序就会 crash 。而且你这个写的也不对,ctx.next()应该放在 recover 后面,而且还有放到 defer 里。不然 ctx.next()先执行,里面有 panic 你的程序就 crash 了
    index90
        11
    index90  
       2020-10-29 17:45:33 +08:00
    用进程守护就不怕中断服务中断吗?
    MarksGui
        12
    MarksGui  
       2020-10-29 18:00:51 +08:00
    @zunceng 在方法内部新开的 goroutine panic 是无法被统一的 recover 的。
    cheng6563
        13
    cheng6563  
       2020-10-29 19:10:59 +08:00 via Android
    写一个健康检查的接口。
    外部用 systemd 或者 docker 之类的进行健康检查。
    SingeeKing
        14
    SingeeKing  
       2020-10-29 20:18:46 +08:00
    service 外面包裹一层自动重启的软件,例如利用 supervisor / pm2 做管理
    SingeeKing
        15
    SingeeKing  
       2020-10-29 20:21:28 +08:00
    没细看,lz 是不是对 supervisor 有误解,supervisor 只是用 Python 写的,可以管理任何进程而不是只能管理 python 程序
    janxin
        16
    janxin  
       2020-10-29 21:12:46 +08:00
    你进程都崩了,很多信息会丢的,你确定这样没问题吗?
    outoftimeerror
        17
    outoftimeerror  
       2020-10-29 21:15:08 +08:00
    docker+k8s
    freestyle
        18
    freestyle  
       2020-10-29 21:18:13 +08:00 via iPhone
    golang 版 supervisord,不需要 Python 环境,一个二进制文件加配置文件 https://github.com/ochinchina/supervisord
    ArJun
        19
    ArJun  
       2020-10-29 21:51:33 +08:00
    docker 最好用
    ericgui
        20
    ericgui  
       2020-10-30 09:58:29 +08:00
    @zunceng 重启还是要靠系统层面解决,比如内存泄露咋办,这 recover 就没用了,平时每次执行都 if else 一下,其实浪费性能
    sunshinev
        21
    sunshinev  
       2020-11-27 18:04:26 +08:00
    supervisored 啊,好使~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2937 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 13:54 · PVG 21:54 · LAX 05:54 · JFK 08:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.