首页 > 解决方案 > Springboot 503 服务不可用

问题描述

我事先为长篇文章道歉!

背景:

我正在处理的服务有一个 angular 7 的前端、springboot 2.0.0.RELEASE 的后端和一个 MongoDB 的数据库层(最新的 docker 版本)。应用程序的所有 3 层都在同一台 RHEL 机器上的自己的 docker 容器中运行,但它们都在同一个 docker 网络上。

Angular 应用程序通过 nginx 容器静态托管,springboot 使用该命令“java -jar app.jar”作为 jar 运行。除了端口,我没有更改 Docker 字段,因此 docker 的所有其他选项都是默认值。

问题:

当我启动所有三个容器并尝试对它们运行量角器 e2e 测试时,我会偶尔从后端收到 503 Service Unavailable。我有一套 12 个测试,所有测试都按顺序运行。我等到所有容器都完全启动后再执行测试,它会在 12 个测试中的任何一个测试中随机失败。测试失败后,我将手动运行测试步骤并尝试复制,但它总是通过。当我在 docker 容器中将后端作为 gradle springboot 运行时,我没有遇到任何问题。所以问题只是当我尝试对 dockerized jar 运行自动化测试时。

我已经在 Spring Web 日志上将日志从 DEBUG 增加到 TRACE,并且一切正常。

我相信这是一个内存问题。可能是运行 java jar 的 java 堆问题或对后端或数据库的 api 调用过载?这是否与为 mongo 和 nginx 容器分配大量内存有关。

任何解决此问题的信息或替代假设将不胜感激。谢谢!

标签: javaangularmongodbdockerspring-boot

解决方案


你真的分析了内存使用情况吗?如果是内存问题,这可能会有所帮助:

众所周知,mongo 分配内存非常激进,尤其是有线老虎存储引擎只是吃内存。此外,在容器中,它不知道其他人在使用内存。你可能想告诉它不那么贪婪:

https://docs.mongodb.com/manual/core/wiredtiger/#memory-use

此外,限制每个容器的资源也是一个好主意(特别是如果它们在同一台机器上竞争):

https://docs.docker.com/config/containers/resource_constraints/#limit-a-containers-access-to-memory

希望这可以帮助


推荐阅读