小编典典

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

spring-boot

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

  1. 生成战争包并将其放入独立的tomcat中
  2. 生成一个jar包并使用嵌入式tomcat

另外,在发布到生产环境时是否应删除devtools依赖性。


阅读 1279

收藏
2020-05-30

共1个答案

小编典典

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

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

在Tomcat之类的servlet容器中进行经典部署后,重新部署后您将面临各种内存泄漏,例如日志框架,管理不善的线程本地对象,JDBC驱动程序等等。您要么花费时间来修复所使用的应用程序和框架内的所有那些内存泄漏,要么在部署后重新启动servlet容器。将应用程序作为独立版本运行时,您不必担心那些内存泄漏,因为您不得不重新启动以启动新版本。

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

实际上,由于服务器上的高负载,独立应用程序无法避免性能下降,但是就内存利用率或GC而言,它不会干扰其他应用程序。请记住,如果您只关注一个应用程序的特性,则性能或GC调整会更加简单。一旦您需要在一个servlet容器中为多个Web应用程序找到共同的分母,就会变得很复杂。

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


为了从生产版本中删除devtools

您可以使用set excludeDevtools build属性来完全删除JAR。Maven和Gradle插件均支持该属性。

参见Spring Boot 文档

2020-05-30