已部署的应用程序立即自行关闭

Deployed application shuts itself down immediately

我有一个 Go rest API 应用程序。我将其 Docker 化并将其部署到 Kubernetes。 它在我的本地正常工作。

但在 Kubernetes 中,应用程序会自行关闭,并且 pod 会重新启动。

它不打印任何内容、任何日志或任何失败。

import ( 
" github.com/gorilla/mux"
"net/http"
"log"

)   
func main() {
    controller := controllers.Controllers{}
    router := mux.NewRouter()
    router.HandleFunc("/customer", controller.GetCustomer()).Methods("GET")
    router.HandleFunc("/customer", controller.InsertCustomer()).Methods("POST")
    router.HandleFunc("/healthcheck", controller.HealthCheck())

    addr := ":" + os.Getenv("PORT")
    srv := &http.Server{Addr: addr, Handler: router}

    go func() {
        if err := srv.ListenAndServe(); err != nil {
            log.Fatalf("listenAndServe failed: %v", err)
        }
    }()
    println("reached here")
}

令人惊讶的是,当我查看日志时它会打印“到达此处”行。 我检查了 env 变量,它也是正确的。 我怀疑对 listenAndServe 的调用失败了,但我找不到合理的答案。

main() 功能结束时,您的应用程序也会结束。它不会等待其他非主 goroutines 完成。参见 Spec: Program execution:

Program execution begins by initializing the main package and then invoking the function main. When that function invocation returns, the program exits. It does not wait for other (non-main) goroutines to complete.

由于您在新的 goroutine 中启动了 listerer,因此没有任何“阻塞”main(),没有什么可做的(在打印 "reached here" 之后),所以您的应用程序结束了。请注意,内置 println() 打印到标准错误,这就是为什么您可能看不到任何日志(标准输出和标准错误可能会保存/重定向到不同的地方)。

最简单的“修复”是在 main() 中开始收听:

srv := &http.Server{Addr: addr, Handler: router}

if err := srv.ListenAndServe(); err != nil {
    log.Fatalf("listenAndServe failed: %v", err)
}