登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-04-01 17:21:34 283浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《已部署的应用程序立即自行关闭》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我有一个 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() 函数结束时,您的应用程序也会结束。它不会等待其他非主协程完成。查看Spec: Program execution:

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

既然你在一个新的 goroutine 中启动了listerer,就没有什么“阻塞”main(),没有什么可做的(在打印 “到达这里” 后),所以你的应用程序结束。请注意,内置的 println() 打印到标准错误,这就是为什么您可能看不到任何日志(标准输出和标准错误可能会保存/重定向到不同的位置)。

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

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

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

今天关于《已部署的应用程序立即自行关闭》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>