将Spring Boot项目发布到生产环境时,选择war(独立的Tomcat)还是jar(嵌入式Tomcat)?

4

最近的项目我使用了Spring Boot,并准备部署到生产环境,我想知道哪种运行应用程序的方式具有更好的性能或相同的性能?

  1. 生成war包并将其放置在独立的Tomcat中运行
  2. 生成jar包并使用嵌入式Tomcat运行

另外,在发布到生产环境时,如果需要删除devtools依赖。

1个回答

11

这是一个广泛的问题。答案取决于您的需求。

个人而言,我今天更喜欢使用Spring Boot独立应用程序。一个应用程序,一个JVM。这样可以在部署和运行时行为方面提供更大的灵活性和可靠性。Spring Boot 1.3.0.RELEASE附带了init scripts,允许您在Linux服务器上将Spring Boot应用程序作为守护进程运行。例如,您可以将rpm-maven-plugin集成到构建流水线中,以便打包和发布您的应用程序作为RPM进行部署,或者您可以轻松地将应用程序docker化

如果您将应用程序传统部署到像Tomcat这样的servlet容器中,您将面临各种内存泄漏,例如记录框架、管理不良的线程本地对象、JDBC驱动程序等等。要么您花时间修复应用程序和使用的框架中的所有这些内存泄漏,要么在部署后重启servlet容器。将应用程序作为独立版本运行时,您不必担心这些内存泄漏,因为您被迫重新启动以使新版本生效。

过去,几个web应用程序运行在一个servlet容器中。这可能导致所有web应用程序的性能下降,因为每个web应用程序都有自己的内存、CPU和GC特性,这可能会互相干扰。此外,像线程池这样的资源是所有web应用程序共享的。

事实上,独立应用程序也不能从服务器高负载导致的性能下降中幸免,但它不会影响其他应用程序的内存利用率或GC。请记住,如果您只关注一个应用程序的特征,则性能或GC调整要简单得多。一旦您需要找到几个web应用程序在一个servlet容器中的共同点,情况就会变得复杂。

最终,你的决定可能取决于你的工作环境。如果你正在一个企业中构建应用程序,其中软件是由运营人员运行和维护的,那么你更有可能被迫构建一个war包。如果你有自由选择你的部署目标,那么我建议使用一个独立的应用程序。
为了从生产构建中删除devtools,

你可以使用excludeDevtools构建属性来完全删除JAR包。该属性在Maven和Gradle插件中都得到支持。

请参见Spring Boot 文档

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接