【问题标题】:How do I run a single JVM with multiple spring boot applications?如何运行具有多个 Spring Boot 应用程序的单个 JVM?
【发布时间】:2020-03-07 02:28:22
【问题描述】:

假设我有 25 个 Spring Boot 微服务,每个微服务都以生产中的 1GB JVM 开始。在任何给定时间,并非所有内存都在使用,并且没有任何实例同时使用完整的 25GB 内存。实际上,它们中的许多会在 90% 的时间里处于空闲状态,但它们中的任何一个都可能在某个时候被调用并需要高达 1GB 的内存。

在我的开发环境中,我想一次运行所有这些,但只有 8GB 内存。我不需要出色的性能,但我需要它们全部同时运行才能使整个应用程序正常工作。我想尝试在具有 6GB 专用内存的单个 JVM 中运行所有应用程序。这在任何时候都应该足够了。

这似乎是一个常见问题,因为许多公司正在转向云/微服务。 10 年前,我们将拥有一个带有单个 JVM 的单体应用程序(易于在开发环境中运行)。现在我们有几十个小型应用程序,它们可能不需要大量内存,但它们每个都运行在自己的 JVM 中,因此每个都有很大的开销。这实际上使开发变得更加复杂而不是简化。所以我试图为我们的开发人员找到一个解决方案,他们可以运行所有东西,但不会杀死他们机器上的内存。

  • Spring Boot 应用程序需要在不修改的情况下运行 也许是本地配置文件。否则,开发人员每次从 git 中提取代码时都必须进行大量更改
  • 每个项目都需要能够配置不同的端口(application-local.properties 设置) 为tomcat。
  • 每个项目都需要自己的类路径条目(例如,一个项目可能使用 jar 的 1.0 版,另一个可能使用 2.0 版,如果没有单独的类路径,一个或另一个会损坏)

我一直在尝试关注这个post,但它不是我想要的 100%。我觉得一个合适的解决方案应该尊重 application.properties / application-local.properties 文件并使用项目内部设置的端口,而不是对项目外部的任何配置进行硬编码。本质上,他的帖子是为每个微服务启动一个单独的线程,并为每个线程附加一个单独的类加载器。然后调用 SpringApplication.run 并传入通常用于启动微服务的类名。我认为这可能是忽略了自动配置属性。

任何帮助将不胜感激!

【问题讨论】:

  • 用户 Docker 与 docker compose 一起运行它们。它应该很容易为您工作,并且是现在这些东西的标准模式。 “似乎这是一个普遍的问题”是对的,答案是容器。
  • 我相信这个解决方案仍然需要为每个服务使用单独的 VM,每个服务都有自己的内存占用。如果是这种情况,那么我不知道它可以解决要求。 Docker 可能会使部署和测试容器变得更简单,但我认为它不会减少内存开销(我猜它会增加它)。
  • 首先在同一个jvm中运行多个具有多个主要功能的程序是不可能的,所以你可以放弃这个想法stackoverflow.com/questions/16220700/…
  • 最简单的恕我直言,将 dockerize 和 docker-compose all 和使用 javaopts,限制每个应用程序 jvm 的内存。微服务的重点是能够在一台机器上运行后端的各个部分,而不是整个生产环境。
  • 它不需要多个主要方法。我引用的帖子有一个单独的项目,其中包含一个主要方法,本质上它调用 SpringApplication.run(classWithSpringBootAnnotation) 来运行每个微服务。但是由于某种原因不尊重每个项目的 application.properties。帖子说要为每个项目传入一个自定义配置 bean 并设置端口,但试图理解为什么它没有为该项目使用 application.properties

标签: spring-boot microservices


【解决方案1】:

您可以使用docker 管理应用程序消耗的资源量。一个 Spring Boot 应用程序应该是一个 docker container。您可以在运行时更改容器使用的资源量(在您的情况下是内存)。看看this 关于如何在运行时更改 docker 中的资源分配的文章。此外,使用kubernetes 可以定义您的应用程序所需的最小和最大资源。

【讨论】:

  • 同样的问题对吗?我不能在开发机器上一次运行 25 个 docker 容器。
  • 你可以这样做,它不会很快,但它会工作
  • 你可以..你在开始时将容器限制为 100mb,然后当其中一个需要更多内存时,你只需执行 docker update 并给他 1gb 内存。当该应用程序完成其工作时,使用 docker update 再次将其限制为 100mb。
猜你喜欢
  • 2015-07-26
  • 2017-02-23
  • 1970-01-01
  • 2015-10-15
  • 1970-01-01
  • 2015-12-30
  • 2019-05-31
  • 2016-07-03
  • 2015-05-19
相关资源
最近更新 更多