首页 文章

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

提问于
浏览
16

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

  • 如果我想将其设置为Windows或Linux服务,那么jar文件是最佳选择吗?

  • 如果我使用jar文件,我将无法重新启动服务器 .

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

  • 如果我重新启动机器,我必须再次执行java -jar .

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

我希望你能帮助我 .

  • -编辑 - -

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

5 回答

  • 0

    jar 打包非常适合 生产环境 ,只有当你真的需要时才应该回退到 war - 这通常是你无法控制部署环境的情况(在大型企业中通常就是这种情况) .

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

    关于你的关注:

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

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

  • 11

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

    1)JAR:

    • 您可以使用不同的端口(在Linux中, java -jar ... > app_logs.log & )独立运行每个应用程序,并且可以对其进行路由(例如nginx) . 请注意,重新启动不是问题 . 您可以编写自定义bash脚本(如下所示: ps aux | grep appname 并通过PID终止)

    • 但配置 生产环境 应用程序时存在一些问题 . 属性文件将存档到jar中 .

    2)战争

    • 您可以部署到容器中并运行它 . 易于管理服务器 . 如果要重新配置应用程序,请从容器内的未归档文件夹中打开属性文件,根据需要进行更改并重新启动容器 . 因此,管理和配置将很容易 .

    • 但是,如果您想在此服务器中使用另一个端口运行另一个应用程序,则必须安装另一个容器副本并对其进行配置 .

    所以,在我的实践中,使用war app比jar更容易管理和重新配置 .

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

    • 重启机器还是JVM? Spring引导中内置了一个关闭机制,你只需要激活它(你应该启用安全机制,这样任何人都不能这样做),参见:How to shutdown a Spring Boot Application in a correct way?

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

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

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

  • 0

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

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

  • 2

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

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

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

相关问题