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,但找不到合理的答案。为什么会是这个原因?
当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)