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

时间:2016-09-21 20:43:50

标签: java spring maven tomcat spring-boot

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

  1. 如果我想将其设置为Windows或Linux服务,那么jar文件是最佳选择吗?
  2. 如果我使用jar文件,我将无权重启服务器。
  3. 将来我可能需要在同一容器中使用更多应用程序。
  4. 如果我重新启动机器,我必须再次执行java -jar。
  5. 一般来说,问题是哪个更好地使用jar文件并在生产中将其作为java -jar jarname.jar执行,或者将包装更改为war将tomcat设置为提供,并将生成的war设置为空的tomcat。

    我希望你能帮助我。

    --- --- EDIT

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

5 个答案:

答案 0 :(得分:11)

jar 打包非常适合制作,只有在您真的需要时才应该回退到 war - 这通常是您无法控制部署环境的情况(大型企业经常出现这种情况)。

Spring Boot Reference中有一章关于将基于Spring Boot的应用程序设置为Unix / Linux / Windows服务:Installing Spring Boot applications

关于你的担忧:

  

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

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

答案 1 :(得分:2)

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

1)JAR:

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

2)战争

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

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

答案 2 :(得分:0)

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

  2. 重启机器还是JVM? Spring引导中内置了一个关闭机制,您只需要激活它(并且您应该启用安全机制,这样任何人都无法做到这一点),请参阅:How to shutdown a Spring Boot Application in a correct way?

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

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

  5. 我觉得你宁愿以老式的方式去做。尽管有“品味”的问题。回答,pro-jar有一个参数:唯一的依赖是JVM!其余的(web-app-container,db-drivers,其他库)都是你提供的软件包的一部分。如果您决定更换下一个版本的容器,那么它也是。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

我对服务器的知识了解不多,但是我的建议是

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

  • 如果用于 Micro Service 应用程序,请使用嵌入式 雄猫与不同的端口。而且每个微服务应用程序都是 彼此独立。