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

zhu*_*wei 3 spring-boot

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

  1. 生成一个war包并将它放在一个独立的tomcat中
  2. 生成一个jar包并使用嵌入式tomcat

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

Kam*_*kol 9

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

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

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

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

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

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


为了从生产构建中删除devtools

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

请参阅Spring Boot 文档.