如何高效地docker化java微服务

问题描述 投票:0回答:2

虽然 Java 应用程序服务器将扩展唯一的 JVM 来运行多个(微)服务,但 dockerized java 微服务架构将为每个 dockerized 微服务运行一个 JVM。 考虑到 20 多个 Java 微服务和有限数量的主机,每台主机上的 JVM 消耗的资源量似乎是巨大的。

有没有有效的方法来解决这个问题?是否可以调整每个 JVM 以限制资源消耗? 目的是限制在 java 微服务架构中使用 docker 的开销。

java docker jvm microservices application-server
2个回答
3
投票

每个运行的 Docker 和 JVM 副本都使用内存。通常,单个节点上有多个 JVM 会使用共享内存,但这不是 docker 的一个选项。

您可以做的是减少每个 JVM 的最大堆大小。不过,我允许每个 docker 镜像至少有 1 GB 的开销加上每个 JVM 的堆大小。虽然这听起来像是很多内存,但现在并不花费那么多。

假设您为每个 JVM 提供 2 GB 堆,并为 docker+JVM 添加 1 GB,您需要一台 64 GB 服务器来运行 20 个 JVM/docker。


0
投票

可以通过优化微服务来减少内存消耗。但是,如果您已经最大限度地优化了流程,但对内存使用情况仍然不满意怎么办?

答案是GRAAL VM

GraalVM 可以为创建 OCI 映像提供多项显着优势,特别是对于 Java 微服务

性能

  1. 更低的内存占用:本机映像消除了对传统 JVM 的需求,从而缩小了容器大小并降低了内存利用率,从而允许在 OCI 资源上进行更密集的部署。
  2. 更快的启动:GraalVM 将代码预编译为本机可执行文件,与传统 Java 应用程序相比,可实现即时启动。这意味着减少资源消耗并加快容器准备速度。
  3. 减少 CPU 使用率:GraalVM 本机映像中优化的代码执行和最小化垃圾收集可降低 CPU 消耗,使您的应用程序在 OCI 计算资源上更具成本效益。

便携性

  1. 独立运行时:GraalVM 原生镜像是独立的,不需要特定的 JVM 版本,消除了运行时环境依赖问题并简化了跨不同 OCI 环境的部署。
  2. 减少运行时占用空间:由于应用程序未捆绑 JRE,因此图像尺寸更小,从而缩短了下载时间并降低了容器注册表存储成本。

安全

  1. 更小的攻击面:预编译的本机映像仅包含必要的代码,与 OCI 容器中的传统 Java 应用程序相比,减少了攻击面和潜在漏洞。
  2. 降低运行时风险:GraalVM 本机映像中的代码执行开销和运行时环境最小化,可降低 OCI 容器内的漏洞利用和恶意活动的风险。

额外优势

  1. 改善开发人员体验:借助本机映像,更快的构建时间和更简单的部署可以提高开发人员的工作效率。
  2. 资源可扩展性:GraalVM 应用程序占用空间更小,资源消耗更低,可在 OCI 基础设施上实现高效扩展。
  3. 云集成:GraalVM 与 Oracle 云基础设施监控等 OCI 服务进行本机集成,以增强性能监控和优化。

但是,重要的是要考虑任何潜在的缺点

  1. 学习曲线:有效利用 GraalVM 可能需要开发人员适应其特定的构建和部署流程。
  2. 有限的语言支持:虽然 GraalVM 支持多种语言,但 Java 是其主要关注点。其他语言可能有限制或编译时间较慢。
  3. 有限的工具:某些现有的 Java 工具和库可能与 GraalVM 本机映像不完全兼容。

总体而言,GraalVM 为创建 OCI 映像提供了引人注目的优势,特别是在性能、可移植性和安全性方面。根据您的特定用例和优先级权衡优点和潜在缺点可以帮助您确定 GraalVM 是否是 OCI 部署的正确选择。

© www.soinside.com 2019 - 2024. All rights reserved.