• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于后端:使用-Go-116-的-signalNotifyContext-让你的服务重启更优雅

linux 搞代码 3年前 (2022-03-03) 16次浏览 已收录 0个评论

在 Go 1.16 的更新中,signal包减少了一个函数 NotifyContext,
这让咱们优雅的重启服务(Graceful Restart)能够写的更加优雅。

一个服务想要优雅的重启次要蕴含两个方面:

  • 退出的旧服务须要 Graceful Shutdown,不强制杀过程,不透露系统资源。
  • 在一个集群内轮流重启服务实例,保障服务不中断。

第二个问题跟部署形式相干,改天专门写一篇探讨,明天咱们次要谈怎么样优雅的退出。

首先在代码里,用了内部资源,肯定要应用defer去调用Close()办法敞开。
而后咱们就要拦挡零碎的中断信号,保障程序收到中断信号之后,被动有序退出,这样所有的 defer 才会被执行。

在以前,大略是这么写:

<code class="golang">func everLoop(ctx context.Context) {
LOOP:
    for {
        select {
        case <-ctx.Done():
            // 收到信号退出有限循环
            break LOOP
        default:
            // 用一个 sleep 模仿业务逻辑
            time.Sleep(time.Second * 10)
        }
    }
}

func main() {
    // 建设一个能够手动勾销的 Context
    ctx, cancel := context.WithCancel(context.Background())

    // 监控零碎信号,这里只监控了 SIGINT(Ctrl+c),SIGTERM
    // 在 systemd 和 docker 中,都是先发 SIGTERM,过一段时间没退出再发 SIGKILL
    // 所以这里没捕捉 SIGKILL
    sig := make(chan os.Signal, 1)
    signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
    go func() {
        <-sig
        cancel()
    }()

    // 开始有限循环,收到信号就会退出
    everLoop(ctx)
    fmt.Println("graceful shuwdown")
}

当初有了新的函数,这一段变得更简略了:

<code class="golang">func main() {
    // 监控零碎信号和创立 Context 当初一步搞定
    ctx, stop := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
    // 在收到信号的时候,会主动触发 ctx 的 Done ,这个 stop 是不再捕捉注册的信号的意思,算是一种开释资源。
    defer stop()

    // 开始有限循环,收到信号就会退出
    everLoop(ctx)
    fmt.Println("graceful shuwdown")
}

感激 Golang ,当年用别的语言须要写一大堆代码的性能,当初几行就能够轻松实现了。
让它成为你服务程序的标配吧。

最初,我是写最新的独立我的项目LetServerRun的时候,发现这种最新的写法的。
LetServerRun 能够让你把微信公众号当作随身的 Terminal 管制你的服务端。
在它的 Agent 的 main 函数中就有上述用法的示例,
欢送参考。

附上 LetServerRun 的服务号二维码,感兴趣的同学能够关注一下:


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于后端:使用-Go-116-的-signalNotifyContext-让你的服务重启更优雅

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址