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

时间:2018-07-29 01:57:00

标签: java spring docker spring-boot

我在Docker数据中心上部署了Java Spring Boot应用程序。每当我们为服务部署堆栈时,它就会按预期杀死所有现有容器并使用新映像启动新容器。但是问题是,当Spring应用程序在容器内启动时(通常是30-40秒),我们会收到504 Bad Gateway。我的直觉是,由于容器已启动并正在运行,负载平衡器向容器发送请求,但应用程序仍在启动,有没有办法解决这个问题?之所以会产生影响,是因为我们有5个用于服务的容器,并且每个容器发生相同的事情。因此,发生这种情况时,很大一部分用户会得到错误。

2 个答案:

答案 0 :(得分:0)

您的撰写文件中有一个解决方案: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/image的更新版本时,swarm将关闭两个容器,部署两个新的容器,在几秒钟内等待<yourStartupTimeInSeconds+3>,直到它部署具有新映像的其他两个副本,然后等待再次部署其余的。

您前面的负载均衡器(服务)仍然进行运行状况检查(节点可能会发生故障),对吗?

答案 1 :(得分:-1)

每个docker Orchestrator都有一个“运行状况检查”系统,该系统旨在消除此问题(运行状况检查或就绪或活跃度或...)。

如果您在应用程序上创建“ ping”端点(或类似的端点也可以检查所需资源的类似端点),则可以将运行状况检查设置为对此端点发出HTTP请求,并且只有在您的回复为200。

仅当健康检查正常时,才会将启动容器放在服务池中。在此之前,您的容器将不会收到任何请求。

此外,这种检查还用于确定是否存在问题(应用程序没有死机,但形状不好,使响应时间真正变长或发送错误)时是否需要重新启动容器(k8s中的Pod) )。

请注意,某些前端负载均衡器也可以使用这种运行状况检查。但是仅当您具有从此负载均衡器到Docker容器的直接连接时才需要使用它(这种直接链接实际上不是一个好习惯)。