我有一个Go rest API应用程序。我将它Dockerized并部署到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()
函数结束时,您的应用程序也结束了。它不等待其他非主例程完成。参见规范:程序执行:
程序执行首先初始化主包,然后调用
main
函数。当函数调用返回时,程序退出。它不等待其他(非main
)例程完成。
由于您在一个新例程中启动侦听器,因此没有任何"阻塞"main()
,没有什么要做的(在打印"reached here"
之后),所以你的应用程序结束了。请注意,内置的println()
打印到标准错误,这就是为什么您可能看不到任何日志(标准输出和标准错误可能被保存/重定向到不同的地方)。
最简单的修复"是在main()
:
srv := &http.Server{Addr: addr, Handler: router}
if err := srv.ListenAndServe(); err != nil {
log.Fatalf("listenAndServe failed: %v", err)
}