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

kuz*_*zua 0 rest http go gorilla kubernetes

我有一个 Golang 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")
}
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,当我查看日志时,我可以看到“到达此处”行。因此,出于某种原因,它会自行关闭。我检查了 env 变量,它也是正确的。我怀疑listenAndServe,但找不到合理的答案。为什么会是这个原因?

icz*_*cza 5

main()函数结束时,您的应用程序也会结束。它不会等待其他非主 goroutine 完成。请参阅规范:程序执行:

程序执行首先初始化主包,然后调用函数main。当该函数调用返回时,程序退出。它不会等待其他(非main)goroutine 完成。

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

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

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

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