gracehttp: 优雅重启 Go 程序(热启动)

fevin · · 3652 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

问题背景

http 应用程序重启时,如果直接 kill -9 使程序退出,然后在启动,会有以下几个问题:

  1. 旧的请求未处理完,如果服务端进程直接退出,会造成客户端链接中断(收到 RST);
  2. 新请求打过来,服务还没重启完毕,造成 connection refused

这些问题会造成不好的客户体验,严重的甚至影响客户业务。所以,我们需要优雅的重启我们的应用。

解决问题 -- 优雅

Github: gracehttp

原理

  1. 信号机制;
  2. 子进程继承父进程的资源;

支持功能

  1. 平滑重启(Zero-Downtime restart server);
  2. 平滑关闭;
  3. Server 添加(包含 HTTPHTTPS);
  4. 自定义日志组件;

使用指南

添加服务器

    // http
    srv1 := &http.Server{
        Addr:    ":80",
        Handler: sc,
    }
    gracehttp.AddServer(srv1, false, "", "")

    // https

    srv2 := &http.Server{
        Addr:    ":443",
        Handler: sc,
    }
    gracehttp.AddServer(srv2, true, "../config/https.crt", "../config/https.key")

    gracehttp.Run() // 此方法会阻塞,直到所有的 HTTP 服务退出

如上所示,只需创建好 Server 对象,调用 gracehttp.AddServer 添加即可。

添加自定义日志组件

    gracehttp.SetErrorLogCallback(logger.LogConfigLoadError)

此处提供了三个 Set* 方法,分别对应不同的日志等级:

  • SetInfoLogCallback
  • SetNoticeLogCallback
  • SetErrorLogCallback

有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:fevin

查看原文:gracehttp: 优雅重启 Go 程序(热启动)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3652 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传