Spring启动项目发布到生产环境选择war(独立tomcat)还是jar(嵌入式tomcat)?

时间:2015-11-19 04:30:39

标签: spring-boot

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

  1. 生成一个war包并将其放在一个独立的tomcat中
  2. 生成jar包并使用嵌入式tomcat
  3. 另外,在发布到生产环境时如果要删除devtools依赖项。

1 个答案:

答案 0 :(得分:9)

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

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

将经典部署到像Tomcat这样的servlet容器中,在重新部署之后,您将面临各种内存泄漏,例如使用日志框架,管理不当的线程本地对象,JDBC drivers以及更多内容。 要么花时间修复应用程序和框架中的所有内存泄漏,要么在部署后重新启动servlet容器。将您的应用程序作为独立版本运行,您不必关心那些内存泄漏,因为您被迫重新启动以便为您带来新版本。

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

事实上,由于服务器上的高负载,独立应用程序无法避免性能下降,但在内存利用率或GC方面不会干扰其他应用程序。请记住,如果您可以专注于一个应用程序的特性,那么性能或GC调整会更加简单。一旦你需要在一个servlet容器中找到几个webapp的公分母,它就会变得复杂。

最后,您的决定可能取决于您的工作环境。如果您正在运营和维护软件的公司中构建应用程序,则您更有可能被迫制造战争。如果您可以自由选择部署目标,那么我建议使用独立的应用程序。

为了从生产版本中删除devtools

  

您可以完全使用设置excludeDevtools构建属性   删除JAR。 Maven和Maven都支持该属性   Gradle插件。

请参阅Spring Boot documentation