Spring Boot嵌入式容器或将war文件部署在外部容器中用于生产环境。

25

我完全能够在两种情况下配置Spring Boot,问题在于哪一种更加健壮并且更受推荐,因为我在Spring Boot文档中没有找到将其部署到生产环境的推荐方式,我的担忧关于使用嵌入式容器:

  1. 如果我想将其设置为Windows或Linux服务,jar文件是最佳选择吗?
  2. 如果我使用jar文件,我将无法访问重新启动服务器的选项。
  3. 也许在未来我需要在同一容器中运行更多应用程序。
  4. 如果我重新启动机器,我必须再次执行java -jar命令。

总的问题是,在生产环境中,将其打包成jar文件并通过java -jar jarname.jar命令执行,还是将打包方式更改为war文件,并将Tomcat设置为“provided”,然后将生成的war文件设置为一个空Tomcat,哪种更好?

希望能对您有所帮助。

---编辑---

很多时候答案都是"取决于"。这是针对普通Web应用程序或REST Web服务的。


我曾经有同样的问题,我认为最好在Tomcat服务器上运行它。但这取决于您的项目使用什么类型的操作。此外,我认为Tomcat提供了一些安全性来运行它。 - Paulo Galdo Sandoval
“Also i think tomcat provide some security to run it.” 这句话中的“security”是指哪种安全性? - Andy
我认为他在谈论例如 jdbc 领域。 - Alejandro Agapito Bautista
不错的点子。我们通过在启动应用程序的脚本中添加参数 --spring.config.location 来解决了这个问题。该参数指定了替代配置文件。这样,我们就将包括访问数据在内的 DB 配置外部化了,但也是升级应用程序时保留配置的一种方式。 - Andy
5个回答

21

Jar打包非常适合生产环境,只有在你无法控制部署环境时(这在大型企业中经常发生)才应该退而使用War - 只有在真正需要的情况下才这样做。

Spring Boot参考文档中有一章介绍如何将基于Spring Boot的应用程序设置为Unix / Linux / Windows服务:安装Spring Boot应用程序

关于您的担忧:

也许将来我需要在同一个容器中运行更多的应用程序。

使用嵌入式容器,如果你需要在同一台机器上运行更多的应用程序,你应该分别启动两个应用程序,每个应用程序运行在不同的端口上,实际上你将会得到两个容器运行 - 这是很好的,应用程序之间的隔离更好。


2
JAR部署的问题在于,如果您有N个应用程序,则会有N个嵌入式服务器。从隔离的角度来看,这是好的,但它会将应用程序服务器消耗的内存乘以N倍。如果N很大,这可能会成为一个问题。不是吗? - Ortomala Lokni

8
大约一个月前,我也有和你类似的问题。让我分享一下我的结论:
1)JAR:
- 你可以使用不同的端口独立运行每个应用程序(在Linux中,使用“java -jar ... > app_logs.log &”),并且你可以路由它(例如nginx)。请注意,重新启动没有问题。你可以编写自定义bash脚本(例如:ps aux | grep appname,并通过PID杀死)。 - 但是,在配置生产应用程序时会存在一些问题。属性文件将被归档到jar中。
2)WAR
- 你可以部署到容器中并直接运行。在服务器上进行简单的管理。如果你想重新配置应用程序,请从容器内未归档的文件夹中打开属性文件,按需要更改并重新启动容器。所以,管理和配置将变得容易。 - 但是,如果你想在该服务器上使用另一个端口运行另一个应用程序,则必须安装另一个容器的副本并对其进行配置。
因此,在我的实践中,使用WAR应用程序比JAR更容易管理和重新配置。

6
我不同意关于war和jar的结论。使用内嵌Tomcat的Spring Boot作为可执行jar文件更加容易。对于多实例运行和需要不同端口的担忧,可以通过使用配置文件和在启动时指定所需的配置文件进行解决,例如:--spring.profiles.active=prodconfig1等。甚至更好的方法是将所需的Tomcat端口作为VM参数传递:-Dserver.port=9090,这将输出:(TomcatEmbeddedServletContainer)- Tomcat已在端口(http):9090上启动。 - pczeus
4
经过这么长时间,我同意你的想法。 - Mirjalol Bahodirov

0

0

我对服务器相关的事情不是很了解,但我的建议是:

  • 如果您正在使用单片应用程序,请最好使用带有外部Tomcat的war包。

  • 如果您正在使用微服务应用程序,请使用具有不同端口的嵌入式Tomcat。每个微服务应用程序都是相互独立的。


0
  1. 我对Windows服务不是很了解,但在Linux上,您可以将jar的执行添加到RC-Scripts中(从而使应用程序在某个运行级别下启动)。对于Spring Boot应用程序,您只需创建符号链接到jar文件,就可以像任何其他服务一样启动/停止等操作,参见:Spring Boot应用程序作为服务

  2. 重新启动机器还是JVM?Spring Boot内置了关闭机制,您只需激活它(并且应启用安全机制,以便不是任何人都可以这样做),请参见:如何正确关闭Spring Boot应用程序?

  3. Spring-Boot支持微服务 - 因此,想法是为每个Web应用程序/微服务提供一个嵌入式Web应用程序容器。这降低了当仅有一个服务出现问题时失去所有服务的风险。

  4. 是的。每次重新启动后,您必须执行catalina.sh|bat start。或者您可以添加适当的启动脚本(参见1.)

我感觉你更愿意用老式的方式来做。尽管“品味问题”的答案,有一个支持使用jar的论点:唯一的依赖是JVM!其余的(Web应用程序容器、数据库驱动程序、其他库)都是你交付的包的一部分。如果你决定在下一个版本中更改容器,那么它也将随之改变。


不不不,我真的很喜欢使用Spring Boot和Fat Jar,我的唯一关注点是如何在生产环境中部署它,或者根据您的评论,如何创建将jar设置为服务的脚本,因为有关如何在生产环境中部署jar的文档并不多,这就是为什么在生产环境中我使用外部容器的原因。 - Alejandro Agapito Bautista
我之前也不知道,但它比我想的简单得多:https://dev59.com/zmEi5IYBdhLWcg3wNqDN - Andy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接