云上的正常关闭 运行

Graceful shutdowns on Cloud Run

我指的是这篇文章:Graceful Shutdowns on Cloud Run

该示例概述了如何在 Node.js 中执行此操作。

在 Golang 中如何做到这一点?简单地将其添加到 func init() 方法有什么问题吗?

func shutdownGracefully() {
    c := make(chan os.Signal)
    signal.Notify(c, os.Interrupt, syscall.SIGTERM)
    go func() {
        <-c
        // Do some cleanup stuff here...

        os.Exit(0)
    }()
}

How would one do this in Golang?

在 go 中处理正常关闭的惯用方法是使用 select 语句阻止主 goroutine 监听任何信号。从那里您可以在必要时触发所有正确的关闭。

例如:

select {
case err := <-anyOtherError:
    // ...
case signal := <- c:
    // Handle shutdown e.g. like http Server Shutdown
}

我喜欢将它设置在一个 run 函数中,并包含其他启动任务,例如启动服务器、配置等

我们在 https://github.com/GoogleCloudPlatform/golang-samples/pull/1902 提供了正确信号处理的示例 Go 代码。它尚未合并,但本质上强调了如何在 Go 上正确执行此操作。

请注意,当 运行 在本地时,向您的应用程序发送 Ctrl+C 是一个 SIGINT,但是在云端 运行 您将收到 SIGTERM。正确传递取消并优雅地处理服务器关闭同时不丢弃正在进行的请求也很重要(不过,net/http.Server 会为您处理其中的一部分,您将在示例代码中看到)。