【发布时间】: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