Spring引导嵌入式容器或war文件在外部容器中进行生产

我完全能够在两种情况下配置spring boot,这里的问题是哪些更强大并且更推荐,因为我没有在spring boot文档中找到在生产环境中部署它的推荐方法,我对使用嵌入式容器的担忧是:

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

一般的问题是哪个更好地使用jar文件并在生产中将其作为java -jar jarname.jar执行或将包装更改为war将tomcat设置为提供并在空的tomcat中设置生成的war。

我希望你能帮助我。

– -编辑 – –

很多时候,答案取决于,这适用于普通的Web应用程序或restWeb服务。

jar包装非常适合生产,你应该只有在真正需要的情况下才能回归战争 – 当你无法控制你的部署环境时(通常在大型企业中就是这种情况),这种情况经常发生。

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

关于你的关注:

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

对于嵌入式容器,如果需要在同一台机器上运行更多应用程序,则应分别启动两个应用程序,每个应用程序在不同的端口上运行,实际上最终会运行两个容器 – 这很好,应用程序可以更好地相互隔离。

大约一个月前,我遇到了像你这样的问题。 让我分享我的结论:

1)JAR:

  • 您可以使用不同的端口(在linux, java -jar …> app_logs.log& )中独立运行每个应用程序,您可以对其进行路由(例如nginx)。 请注意,重新启动不是问题。 您可以编写自定义bash脚本(如下所示: ps aux | grep appname并通过PID 终止
  • 但配置生产应用程序存在一些问题。 属性文件将存档到jar中。

2)战争

  • 您可以部署到容器中并运行它。 轻松管理服务器。 如果要重新配置应用程序,请从容器内的未归档文件夹中打开属性文件,根据需要进行更改并重新启动容器。 因此,管理和配置将很容易。
  • 但是,如果您想在此服务器中使用另一个端口运行另一个应用程序,则必须安装另一个容器副本并对其进行配置。

因此,在我的实践中,使用war app比jar更容易管理和重新配置。

  1. 我对Windows服务知之甚少,但在Linux上,您可以将jar的执行添加到RC-Scripts(从而使应用程序在某个运行级别启动)。 对于Spring启动应用程序,您只需要符号链接到jar,您可以像任何其他服务一样启动/停止/等,请参阅: Spring Boot应用程序即服务

  2. 重启机器还是JVM? Spring引导中内置了一个关闭机制,您只需要激活它(并且您应该启用安全机制,以便任何人都不能这样做),请参阅: 如何以正确的方式关闭Spring Boot应用程序?

  3. Spring-Boot支持微服务 – 因此我们的想法是为每个webapp /微服务安装一个嵌入式webapp容器。 这样可以降低在只有一个服务中断时丢失所有服务的风险。

  4. 是。 并且你必须在每次重启后执行catalina.sh|bat start 。 或者您添加适当的启动脚本(请参阅1.)

我觉得你宁愿以老式的方式去做。 尽管有’品味’的答案,但有一个论点是pro-jar:唯一的依赖是JVM! 其余的(web-app-container,db-drivers,其他库)都是你提供的包的一部分。 如果您决定更换下一个版本的容器,那么它也将如此。

在生产中使用“war”文件的另一个原因。 Springboot掩盖了Jetty抛出的错误,而在Jetty中部署的WAR正确捕获了它(虽然下面的问题仍在审核中)

https://github.com/spring-projects/spring-boot/issues/8917#issuecomment-294673487

我不太了解服务器类的东西,但我的建议是

  • 如果您使用的是Monolithic应用程序,最好使用与外部tomcat的war。

  • 如果您使用的是Micro Service应用程序,请使用具有不同端口的嵌入式tomcat。 并且每个微服务应用程序彼此独立。