【问题标题】:Deploy multiple instances of spring application部署多个spring应用实例
【发布时间】:2019-11-05 18:04:39
【问题描述】:

我需要部署同一个 spring 应用程序的多个实例。

我实际上使用 docker 作为我的实例的容器,并且每个实例都有 1 个容器。

但是注意到一个容器消耗高达 500mb,这对我来说太多了,因为我需要我的 VPS 来捕获尽可能多的实例,老实说,这些容器仅用于 JVM,没有别的,那就是将整个虚拟环境专用于一个简单的 JVM 实例会浪费大量内存,而我根本不需要它。

我需要的更像是一个工具来帮助我管理实例(如果进程由于某种原因被终止,则自动启动,如果开发了新版本的应用程序,则轻松更新实例,通过线路管理实例用于调试或其他什么的命令。)就像我可以用 Docker 做的一样,但没有一个太“贪婪”的整个虚拟化环境

顺便说一句,我有一个来自 OVH Cloud Services 的 VPS,它不提供任何类型的 spring 类部署服务。我正在开发传统的 Ubuntu 18.04。

提前致谢

【问题讨论】:

  • 看起来您将几个问题合二为一。要解决内存问题,您应该首先查看 JVM 参数(HeapSize 和 MetaSpace)并根据应用程序的内存使用情况发出限制。管理你的容器是一个完全不同的主题......
  • 与 JVM 无关,因为当我在没有容器的情况下启动应用程序时,它不会消耗太多内存(大约 100mb)。

标签: java spring spring-boot deployment web-deployment


【解决方案1】:

您应该从堆栈的底部到顶部进行处理。我将尝试回答每个主题,但我建议您将其分成几个问题,以便人们可以对每个问题给出更详细的答案。

我将给你一个概述,以便你有一个起点。

JVM 内存限制

首先,通过对 JVM 设置一致的限制来控制内存分配。您可以通过设置 Max Heap Size 和 Max Metaspace size (Java 8) 来实现。

您可以通过附加标志 -Xmx 来设置最大堆大小。 -Xmx1G 将堆大小限制为 1 GB。

可以使用-MaxMetaspaceSize设置元空间。元空间是在 Java 8 中引入的。如果你使用的是 Java 6 或 7,你应该看看 PermGen。

容器限制

您还可以使用将 -m 标志附加到 docker run 命令来设置容器的最大内存。您可以在这里查看 docker 的文档:https://docs.docker.com/config/containers/resource_constraints/

容器管理

这值得自己详细回答。首先,Spring Framework 它与您要实现的目标无关。它不会解决自动重启或类似问题。

您正在寻找的是一个容器管理工具。你可以看看 docker swarm、portainer 或 kubernetes。

它们将允许您启动同一服务的多个实例,而无需在代码级别进行任何更改。

对于快速而肮脏的实现,您可以使用 docker swarm,它很简单,并且与 docker 容器无缝集成。

【讨论】:

  • 很好的答案,对于这么晚的回复感到抱歉...我已经使用 -m 参数限制了容器的内存消耗,当我使用 docker stats 命令检查它时,我的容器消耗了 700mb,我把它限制在 256mb,现在它只消耗 218mb ......只是不知道它是否真的是一个明智的选择......
猜你喜欢
  • 2013-04-25
  • 1970-01-01
  • 2014-09-16
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 2018-10-03
  • 2019-08-21
  • 1970-01-01
相关资源
最近更新 更多