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

Ale*_*sta 22 java spring tomcat maven spring-boot

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

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

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

我希望你能帮助我.

- -编辑 - -

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

Mac*_*iak 13

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

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

关于你的关注:

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

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

  • jar 部署的问题在于,如果您有 N 个应用程序,您将有 N 个嵌入式服务器。如果从隔离的角度来看它是好的,它会将应用程序服务器消耗的内存乘以 N。如果 N 很大,这可能是一个问题。不是吗? (2认同)

Mir*_*rov 7

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

1) 罐子:

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

2) 战争

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

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

  • 我不同意战争与罐子的结论。使用嵌入式 Tomcat 作为可执行 jar 文件运行 Spring Boot 是一种更容易的实践。通过使用配置文件并在启动时指定配置文件,可以轻松解决对多个实例运行和对不同端口的需求的担忧,例如:--spring.profiles.active=prodconfig1 等。或者甚至更好,只需传入所需的tomcat 端口作为 VM 参数:-Dserver.port=9090 产生输出:(TomcatEmbeddedServletContainer) - Tomcat 在端口上启动:9090 (http) (5认同)
  • 过了这么久,我同意你的想法。 (3认同)

And*_*ndy 0

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

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

  3. Spring-Boot 支持微服务 - 因此我们的想法是为每个 Web 应用程序/微服务拥有一个嵌入式 Web 应用程序容器。这降低了当只有一项服务出现故障时失去所有服务的风险。

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

我感觉你宁愿用老式的方式来做。尽管有“口味问题”的答案,但 pro-jar 有一个论点:唯一的依赖项是 JVM!其余部分(web-app-container、db-drivers、其他库)都是您提供的包的一部分。如果您决定更改下一个版本的容器,那么它也会如此。