为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

2 回答

?
PIPIONE

TA贡献1829条经验 获得超9个赞

您的撰写文件中有一个解决方案: update_config


version: '3.4'

services:

  your-app:

    image: your/image:old

    deploy:

      replicas: 5

      update_config:

        parallelism: 2

        delay: <yourStartupTimeInSeconds+3>s

        order: stop-first

因此,当您部署更新版本的your/imageswarm 时,swarm 将关闭两个容器,部署两个新容器,等待<yourStartupTimeInSeconds+3>几秒钟,直到它使用新映像部署另外 2 个副本,再次等待并部署剩余的一个。


无论如何,您前面的负载均衡器(服务)都会进行健康检查(节点可能会失败),对吗?


查看完整回答
反对 回复 2021-06-17
?
aluckdog

TA贡献1847条经验 获得超7个赞

每个 docker Orchestrator 都有一个“健康检查”系统,旨在消除这个问题(健康检查或准备或活跃度或......)。

如果您在您的应用程序上创建一个“ping”端点(或类似也检查所需资源的就绪端点之类的东西),您可以设置运行状况检查以向该端点发出 HTTP 请求,并且只有在您有响应时才能成功200。

只有当健康检查没问题时,起始容器才会在服务池中。在此之前,您的容器不会收到任何请求。

此外,这种检查还用于确定您的容器(k8s 中的 pod)是否需要在出现问题时重新启动(应用程序未死,但形状不佳,使响应时间确实更长,或发送错误)。

请注意,某些前端负载均衡器也可以使用这种健康检查。但是只有当您从这个负载均衡器直接连接到 docker 容器时才需要使用它(这种直接链接并不是一个很好的做法)。


查看完整回答
反对 回复 2021-06-17
  • 2 回答
  • 0 关注
  • 102 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信