使用 Fat Jars 优于容器的优势
Advantages of using Fat Jars over Containers
我想知道这两者的区别,以及根据行业标准目前使用较多的是哪一种。我尝试在网上查找资源,但关于 Fat Jars 的内容非常少,而且两者之间几乎没有任何对比。
根据您的需要,您可以使用独立的脂肪罐或容器内的脂肪罐。我要说的重点是两者之间没有对峙,事实上它们是互补的。
Fat jar 是包装 java 应用程序的主要方式,因此它可以很容易地容器化。
当然,您也可以单独使用 fat jar。
容器化的优点:
- 您可以利用容器的统一工具。即,您设置 docker 并且您可以 运行 任何容器 - 无论是 java 与 fat jar 还是 node.js 或其他任何容器。
- 您可以利用各种容器编排系统(docker compose、docker swarm、kubernetes 等)——这意味着您可以使用统一的工具进行健康检查、监控、滚动更新等
- 您无需担心系统上的 JRE / JDK 版本等问题。
当您可能仍想独立使用时:
- 当您拥有以 java 为中心的架构并围绕该架构建立流程时,从该架构更改为现代容器编排的成本会很高。
- 当您使用 java 作为实例上的主要脚本(或应用程序)平台并且根本不希望容器有任何开销时。
乍一看好像没什么大不了的。原因是 Java 打包系统非常成熟,并且经过多年发展壮大。许多其他生态系统并没有从中受益,但可以通过打包到容器镜像中获益匪浅。但容器不仅仅是包装。包装几乎可以被认为是它的副作用。
除其他外,使用容器优于简单 Fat JARS 的一些好处是:
简化基础架构
对于围绕微服务构建的大型(或中型)企业,很可能并非所有企业都使用相同的语言和工具。容器提供了一种可预测的方式来以相同的方式部署所有这些不同的东西,因此它极大地简化了基础设施,从而大大降低了公司的成本。这在部署到云端时变得更加重要,尤其是在多云提供商场景中,在这种情况下,Kubernetes 等软件提供的容器编排可以毫不费力地提供很多帮助。
一致性
容器相对于常规 JAR 的另一个好处是跨环境的一致性。例如,假设您将 JAR 部署到 DEV (运行 Java 8),然后部署到 PROD (运行 Java 10)。由于某些原因,JVM 的行为不同,可能是因为默认的垃圾收集器或其他原因,使您的程序在两种环境中的行为都不同。当您通过容器镜像部署时,相同的镜像将在不同的环境中使用,因此将始终使用相同的 Java 版本,从而减少出错的可能性。
资源隔离
还有一个好处是资源隔离。容器可以确保您的应用程序 "see" 只有预定数量的内存和 CPU。其实,Java10关于这件事有一些改进,你可以阅读更多相关内容here。
希望本文能提供一个更好的观点。
我想知道这两者的区别,以及根据行业标准目前使用较多的是哪一种。我尝试在网上查找资源,但关于 Fat Jars 的内容非常少,而且两者之间几乎没有任何对比。
根据您的需要,您可以使用独立的脂肪罐或容器内的脂肪罐。我要说的重点是两者之间没有对峙,事实上它们是互补的。
Fat jar 是包装 java 应用程序的主要方式,因此它可以很容易地容器化。
当然,您也可以单独使用 fat jar。
容器化的优点:
- 您可以利用容器的统一工具。即,您设置 docker 并且您可以 运行 任何容器 - 无论是 java 与 fat jar 还是 node.js 或其他任何容器。
- 您可以利用各种容器编排系统(docker compose、docker swarm、kubernetes 等)——这意味着您可以使用统一的工具进行健康检查、监控、滚动更新等
- 您无需担心系统上的 JRE / JDK 版本等问题。
当您可能仍想独立使用时:
- 当您拥有以 java 为中心的架构并围绕该架构建立流程时,从该架构更改为现代容器编排的成本会很高。
- 当您使用 java 作为实例上的主要脚本(或应用程序)平台并且根本不希望容器有任何开销时。
乍一看好像没什么大不了的。原因是 Java 打包系统非常成熟,并且经过多年发展壮大。许多其他生态系统并没有从中受益,但可以通过打包到容器镜像中获益匪浅。但容器不仅仅是包装。包装几乎可以被认为是它的副作用。
除其他外,使用容器优于简单 Fat JARS 的一些好处是:
简化基础架构
对于围绕微服务构建的大型(或中型)企业,很可能并非所有企业都使用相同的语言和工具。容器提供了一种可预测的方式来以相同的方式部署所有这些不同的东西,因此它极大地简化了基础设施,从而大大降低了公司的成本。这在部署到云端时变得更加重要,尤其是在多云提供商场景中,在这种情况下,Kubernetes 等软件提供的容器编排可以毫不费力地提供很多帮助。
一致性
容器相对于常规 JAR 的另一个好处是跨环境的一致性。例如,假设您将 JAR 部署到 DEV (运行 Java 8),然后部署到 PROD (运行 Java 10)。由于某些原因,JVM 的行为不同,可能是因为默认的垃圾收集器或其他原因,使您的程序在两种环境中的行为都不同。当您通过容器镜像部署时,相同的镜像将在不同的环境中使用,因此将始终使用相同的 Java 版本,从而减少出错的可能性。
资源隔离
还有一个好处是资源隔离。容器可以确保您的应用程序 "see" 只有预定数量的内存和 CPU。其实,Java10关于这件事有一些改进,你可以阅读更多相关内容here。
希望本文能提供一个更好的观点。