Dockerized Java Spring Boot 应用程序在启动应用程序时抛出

我在 docker 数据中心部署了一个 java spring boot 应用程序。每当我们为服务部署堆栈时,正如预期的那样,它会杀死现有容器并使用新镜像启动新容器。但问题是当 spring 应用程序在容器内启动时,我们得到 504 Bad Gateway,这通常需要 30-40 秒。我的预感是因为容器已启动并正在运行,负载均衡器向容器发送请求但应用程序仍在启动,有没有办法解决这个问题?它会产生影响,因为我们有 5 个容器用于服务,并且每个容器都会发生同样的事情。因此,在发生这种情况时,很大一部分用户会遇到错误。


白衣染霜花
浏览 103回答 2
2回答

PIPIONE

您的撰写文件中有一个解决方案: update_configversion: '3.4'services:&nbsp; your-app:&nbsp; &nbsp; image: your/image:old&nbsp; &nbsp; deploy:&nbsp; &nbsp; &nbsp; replicas: 5&nbsp; &nbsp; &nbsp; update_config:&nbsp; &nbsp; &nbsp; &nbsp; parallelism: 2&nbsp; &nbsp; &nbsp; &nbsp; delay: <yourStartupTimeInSeconds+3>s&nbsp; &nbsp; &nbsp; &nbsp; order: stop-first因此,当您部署更新版本的your/imageswarm 时,swarm 将关闭两个容器,部署两个新容器,等待<yourStartupTimeInSeconds+3>几秒钟,直到它使用新映像部署另外 2 个副本,再次等待并部署剩余的一个。无论如何,您前面的负载均衡器(服务)都会进行健康检查(节点可能会失败),对吗?

aluckdog

每个 docker Orchestrator 都有一个“健康检查”系统,旨在消除这个问题(健康检查或准备或活跃度或......)。如果您在您的应用程序上创建一个“ping”端点(或类似也检查所需资源的就绪端点之类的东西),您可以设置运行状况检查以向该端点发出 HTTP 请求,并且只有在您有响应时才能成功200。只有当健康检查没问题时,起始容器才会在服务池中。在此之前,您的容器不会收到任何请求。此外,这种检查还用于确定您的容器(k8s 中的 pod)是否需要在出现问题时重新启动(应用程序未死,但形状不佳,使响应时间确实更长,或发送错误)。请注意,某些前端负载均衡器也可以使用这种健康检查。但是只有当您从这个负载均衡器直接连接到 docker 容器时才需要使用它(这种直接链接并不是一个很好的做法)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java