求问 Golang Web 服务的自动重启方案 - V2EX
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 3330 次点击
    这是一个创建于 1808 天前的主题,其中的信息可能已经有所发展或是发生改变。
    现在的 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  
    PRO
       2020-10-29 20:18:46 +08:00
    service 外面包裹一层自动重启的软件,例如利用 supervisor / pm2 做管理
    SingeeKing
        15
    SingeeKing  
    PRO
       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     Solana     2654 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 06:37 PVG 14:37 LAX 23:37 JFK 02:37
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86