Spring Boot app vs .war file 部署在 Tomcat/Jetty [已关闭]编辑

2022-09-02 01:31:09

在我的情况下,让我们考虑一个简单的RESTful服务,使用Spring Boot创建和配置。此服务与数据库(例如Postgres)进行通信。

有什么区别:

  • 构建一个 Spring Boot 文件,并通过 ?.jarjava -jar myservice.jar

  • 将其打包到文件并将其部署在Tomcat/Jetty上?.war

第一个选项似乎要容易得多,你只需要运行一个.在第二个选项中,您需要创建Tomcat实例,运行它,然后部署一个文件。还有其他区别吗?这两种方法有什么优缺点吗?.jar.war


答案 1

将其打包到.war文件并将其部署在Tomcat/Jetty上?

如果可能的话,不要这样做。原因:使用嵌入式tomcat(或任何其他服务器运行时,如undertow,netty,jetty等),构建微服务架构要容易得多。

正如Josh Long曾经在他的一次春季IO演讲中所说的那样“make Jar, not War”

另一方面,如果你有一个现有的带有 servlet 容器的基础结构,并且已经有多个 application.wars 在这些 servlet 容器中运行,你所要做的就是将你的应用程序打包为 war 文件并将其移交给发布团队(或者更确切地说,你被迫重用现有的基础结构), 然后这是一个不同的故事...但是,科技界已经在远离这种做法。

同样,本着微服务的精神,本着spring boot的意图,我鼓励你使用嵌入式服务器并制作可运行的jar文件,而不是传统的部署。

编辑

如果你正在对你的应用程序进行 docker 化,你有 2 个选项可以将 tomcat 打包到你的“最终工件”中(通过“最终工件”,我的意思是 docker 镜像,而不是 jar。Jar在这里只是一个中间工件)。

  1. 使用嵌入式 tomcat,以便 tomcat 将打包在你的 jar 中,并使用 JVM docker 映像

  1. 从你的jar中排除tomcat,只需打包你的应用程序并使用tomcat Docker映像。

尽管如此,有一天,我都会选择第一个选项,因为这会使开发过程变得容易得多(这与说,加入新开发人员会更容易)。


答案 2

产品页面上所述,这些 jar 包含 servlet 容器,并将直接启动它。

直接嵌入Tomcat,Jetty或Undertow(无需部署WAR文件)

如果你计划在一台主机上运行你的应用程序,旁边没有其他任何东西(docker?),这可能是一个很好的可能性 - 如果你的主机包含其他应用程序,那么部署战争的方法会更有趣,因为你只能在你的主机上拥有一次这些servlet容器。


推荐