建议部署 war 文件与带有嵌入式容器的可执行 jar

Java领域目前的趋势似乎是从以war文件(或耳朵文件)的形式将java Web应用程序部署到java servlet容器(或应用程序服务器),而是将应用程序打包为带有嵌入式servlet / HTTP服务器(如jetty)的可执行jar。我的意思是,较新的框架更多地影响着新应用程序的开发和部署方式,而不是应用程序交付给最终用户的方式(因为,例如,我明白为什么Jenkins使用嵌入式容器,非常容易获取和移动)。采用可执行jar选项的框架示例:DropwizardSpring BootPlay(好吧,它不是在servlet容器上运行,而是嵌入了HTTP服务器)。

我的问题是,我们来自一个我们已经将我们的应用程序(到目前为止主要是Struts2)部署到单个tomcat应用程序服务器的环境中,如果我们计划使用嵌入式容器方法,需要进行哪些更改,最佳实践或注意事项?目前,我们在一台tomcat服务器上运行了大约10个本土应用程序,对于这些小型应用程序,共享资源并在一台服务器上进行管理的能力很好。我们的应用程序不打算分发给最终用户在其环境中运行。但是,如果我们决定利用更新的java框架,这种方法是否应该改变?向可执行jars的转变是否受到云部署(例如Heroku)的日益普及的刺激?

如果您具有在单个应用程序服务器上以 Play 部署方式管理多个应用程序的经验,而不是在单个应用程序服务器上管理传统的 war 文件部署,请分享您的见解。


答案 1

一个有趣的问题。这只是我对这个话题的看法,所以一切都要谨慎对待。我偶尔会使用 servlet 容器和嵌入式服务器来部署和管理应用程序。我相信使用servlet容器还有很多很好的理由,但我会尽量专注于为什么它们今天不那么受欢迎。

简短版本:Servlet容器非常适合在单个主机上管理多个应用程序,但对于仅管理单个应用程序似乎不是很有用。对于云环境,每个虚拟机一个应用程序似乎更可取且更常见。现代框架希望与云兼容,因此转向嵌入式服务器。


所以我认为云服务是放弃servlet容器的主要原因。就像 Servlet 容器允许您管理应用程序一样,云服务允许您管理虚拟机、实例、数据存储等等。这听起来更复杂,但对于云环境,已经转向单一应用程序机器。这意味着您通常可以像对待应用程序一样对待整个机器。每个应用程序都在具有适当大小的计算机上运行。云实例可以随时弹出和消失,这非常适合扩展。如果应用程序需要更多资源,则可以创建更多实例。

另一方面,专用服务器通常功能强大,但大小固定,因此您可以在一台计算机上运行多个应用程序,以最大限度地利用资源。管理数十个应用程序 - 每个应用程序都有自己的配置,Web服务器,路由和连接等 - 并不好玩,因此使用servlet容器可以帮助您保持一切可管理且自己保持理智。但是,扩展起来更难。云中的Servlet容器似乎不是很有用。它们必须为每个微小的实例进行设置,而不会提供太多价值,因为它们只管理单个应用程序。

此外,云很酷,非云的东西很无聊(如果我们仍然相信炒作的话)。默认情况下,许多框架都尝试可扩展,以便可以轻松将其部署到云中。嵌入式服务器可以快速部署和运行,因此它们似乎是一个合理的解决方案。Servlet 容器通常仍受支持,但需要更复杂的设置。

其他一些要点:

  • 嵌入式服务器可以针对框架进行优化,也可以更好地与框架工具集成(例如 Play 控制台)。
  • 并非所有云环境都附带可自定义的计算机映像。与编写初始化脚本来下载和设置 servlet 容器相比,使用专用软件进行云应用程序部署要简单得多。
  • 我还没有找到一个Tomcat设置,它不会在每次重新部署您的应用程序时都会出现烫发gen空间错误。当您几乎可以立即在过渡实例和生产实例之间切换而无需任何停机时间时,花费更长的时间(重新)启动嵌入式服务器是没有问题的。
  • 如问题中所述,最终用户只需运行应用程序即可非常方便。
  • 嵌入式服务器是便携式的,便于开发。如今,一切都很快,原型和 MVP 需要尽快创建和交付。没有人愿意花太多时间为每个开发人员设置环境。

答案 2

推荐