spring-boot - Spring boot 项目发布到生产环境选择war(standalone tomcat)还是jar(embedded tomcat)?

标签 spring-boot

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

  • 生成war包放到独立的tomcat中
  • 生成jar包并使用嵌入式tomcat

  • 另外,发布到生产环境时,如果要去掉devtools的依赖。

    最佳答案

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

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

    通过经典部署到 Tomcat 等 servlet 容器中,您将在重新部署后面临各种内存泄漏,例如日志框架、管理不善的线程本地对象、JDBC drivers 等等。
    您要么花时间修复您使用的应用程序和框架中的所有内存泄漏,要么在部署后重新启动 servlet 容器。将您的应用程序作为独立版本运行,您不必关心这些内存泄漏,因为您必须重新启动才能启动新版本。

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

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

    最后,您的决定可能取决于您的工作环境。如果您在一家由运营部门运行和维护软件的公司中构建应用程序,则您更有可能被迫发起一场 war 。如果您可以自由选择部署目标,那么我推荐一个独立的应用程序。

    为了从生产版本中删除 devtools

    you can use set the excludeDevtools build property to completely remove the JAR. The property is supported with both the Maven and Gradle plugins.



    请参阅 Spring Boot documentation

    关于spring-boot - Spring boot 项目发布到生产环境选择war(standalone tomcat)还是jar(embedded tomcat)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33795311/

    相关文章:

    java - @Recover(后备方法)与 @CircuitBreaker 一起使用时,一旦所有重试都用尽,就不会被调用

    java - 在集成测试中使用 Spring Boot 测试伪造一个 bean

    java - 如何运行打包在spring boot jar中的主类

    java - 在代码中传递 keycloak 配置参数而不是从 application.properties 中读取

    java - 如何在一个 Jaxb2Marshaller 中处理更多 WSDL?

    spring - 通过 Spring Webflux 中的请求生命周期共享数据

    java - 当 maven build 运行测试时,Spring boot 项目抛出 *$$EnhancerBySpringCGLIB is not an @AspectJ Aspect

    java - graphql-spqr无法查询父类字段

    Java在IntelliJ中添加javax.persistence

    java - Spring - GET URL 中的斜杠字符