java - 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 容器分配大量内存有关。
任何解决此问题的信息或替代假设将不胜感激。谢谢!
解决方案
你真的分析了内存使用情况吗?如果是内存问题,这可能会有所帮助:
众所周知,mongo 分配内存非常激进,尤其是有线老虎存储引擎只是吃内存。此外,在容器中,它不知道其他人在使用内存。你可能想告诉它不那么贪婪:
https://docs.mongodb.com/manual/core/wiredtiger/#memory-use
此外,限制每个容器的资源也是一个好主意(特别是如果它们在同一台机器上竞争):
https://docs.docker.com/config/containers/resource_constraints/#limit-a-containers-access-to-memory
希望这可以帮助
推荐阅读
- git - 如何`git filter-repo`向每个提交添加文件?
- flutter - 文本未更新为颤振中的新值
- postgresql - 无法使用 deno.js 连接到 postgres
- javascript - 导入“@smui/fab”后,CSS 在 Svelte 中无法正常工作?
- javascript - Ajax post 返回空数组
- garbage-collection - 垃圾收集日志轮换
- r - R Magick处理多个文件
- swift - 在 Swift 中为 URL 转换准备字符串
- javascript - 有没有办法将由行分隔的字符串拆分为二维数组?
- node.js - 包含模型和组 - Sequelize/NodeJS