在我的例子中,让我们考虑一个使用 Spring Boot 创建和配置的简单 RESTful 服务。此服务与数据库(例如 Postgres)通信。
有什么区别:
- 构建一个 Spring Boot
.jar
文件并通过 java -jar myservice.jar
在我的远程公共(public)主机上运行它?
或
- 打包成
.war
文件部署到Tomcat/Jetty上?
第一个选项似乎更容易,你只需要运行一个.jar
。在第二个选项中,您需要创建 Tomcat 实例,运行它,然后部署一个 .war
文件。
还有其他区别吗?这两种方法有什么优缺点?
Package it to .war file and deploy it on Tomcat/Jetty?
如果可能的话,
不要这样做。 原因:使用嵌入式 tomcat(或任何其他服务器运行时,如 undertow、netty、jetty 等),构建微服务架构要容易得多。
正如 Josh Long 在他的一次 Spring IO 演讲中所说的“make Jar, not War”
另一方面,如果你有一个带有 servlet 容器的现有基础设施,并且已经有多个 application.wars 在这些 servlet 容器中运行,你所要做的就是将你的应用程序打包为一个 war 文件并手动将其移交给发布团队(或者更确切地说,您被迫只重用现有的基础设施),那就是另一回事了……但是,技术界已经开始放弃这种做法。
同样,本着微服务的精神,本着 spring boot 的精神,我鼓励您使用嵌入式服务器并制作可运行的 jar 文件,而不是使用传统部署。
编辑
如果您正在对您的应用程序进行 docker 化,您有 2 个选项可以将您的 tomcat 打包到您的“最终工件”中(“最终工件”,我指的是 docker 图像,而不是 jar。Jar 在这里只是一个中间工件)。
- 使用嵌入式 tomcat,以便将 tomcat 打包到您的 jar 中并使用 JVM docker 镜像
或
- 从您的 jar 中排除 tomcat,只打包您的应用程序并使用 tomcat Docker 镜像。
不过,无论哪一天,我都会选择第一个选项,因为这会使开发过程变得更加容易(不用说,新开发人员的入职会更容易)。