如何有效地将Java微服务Docker化

mnowg1ta  于 5个月前  发布在  Java
关注(0)|答案(2)|浏览(49)

虽然Java应用服务器将扩展一个独特的JVM来运行多个(微)服务,但dockerized Java微服务架构将为每个dockerized微服务运行一个JVM。考虑到20多个Java微服务和有限数量的主机,每个主机上的JVM消耗的资源量似乎是巨大的。
有没有一种有效的方法来管理这个问题?有没有可能调优每个JVM来限制资源消耗?目的是限制在Java微服务架构中使用Docker的开销。

ctzwtxfj

ctzwtxfj1#

每个运行的Docker和JVM副本都使用内存。通常在一个节点上有多个JVM将使用共享内存,但这不是Docker的选项。
你可以做的是减少每个JVM的最大堆大小。然而,我会允许每个Docker映像至少1 GB的开销加上每个JVM的堆大小。虽然这听起来像是很多内存,但现在并不需要这么多。
假设你给予每个JVM一个2 GB的堆,并为docker+JVM添加1 GB,你需要一个64 GB的服务器来运行20个JVM/dockers。

xjreopfe

xjreopfe2#

理想的解决方案是通过优化微服务来减少内存消耗,但是如果你已经最大限度地优化了你的进程,但仍然对内存使用不满意呢?
另一种减少内存占用的方法是利用ahead-of-time native images

  1. Native Image将Java代码直接提前编译成原生机器代码,无需在Docker镜像中打包Java虚拟机(JVM)。这消除了JVM的显著开销,通常约为200- 300 MB
    1.本机映像将应用程序的大部分依赖项静态链接到可执行文件中,从而减少了映像中对外部库的需求。这进一步减小了映像文件系统的大小。
    1.与传统的Java JAR文件相比,本机映像可执行文件通常需要更少的元数据。您通常可以使用更小的基础映像,如Alpine Linux,因为您不需要JVM特定的功能。
    此外,本机映像几乎立即启动,没有JVM初始化开销,并且在运行时消耗更少的内存。
    这是高效地将Java微服务Dockerize的方法之一

相关问题