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

问题描述 投票:79回答:1

java空间中似乎有一种趋势,即不再以war文件(或ear文件)的形式将java Web应用程序部署到java servlet容器(或应用程序服务器),而是将应用程序打包为可执行jar。像jetty这样的嵌入式servlet / HTTP服务器。我的意思是,更新的框架影响新应用程序的开发和部署方式,而不是如何将应用程序交付给最终用户(因为,例如,我知道Jenkins使用嵌入式容器,非常容易抓住和去)。采用可执行jar选项的框架示例:DropwizardSpring BootPlay(它不在servlet容器上运行,但嵌入了HTTP服务器)。

我的问题是,来自我们已经将我们(直到这一点,主要是Struts2)应用程序部署到单个tomcat应用程序服务器的环境,如果我们计划使用嵌入式容器方法,需要做出哪些更改,最佳实践或注意事项?目前,我们在单个tomcat服务器上运行大约10个自行开发的应用程序,对于这些小型应用程序,共享资源并在一台服务器上进行管理的能力很不错。我们的应用程序无意分发给最终用户以在其环境中运行。但是,如果我们决定利用更新的Java框架,那么这种方法会改变吗?越来越多地使用云部署(例如,Heroku)刺激了可执行jar的转变?

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

java playframework war spring-boot dropwizard
1个回答
73
投票

一个有趣的问题。这只是我对这个话题的看法,所以要把所有东西都拿出来。我偶尔使用servlet容器和嵌入式服务器部署和管理应用程序。我确信使用servlet容器还有很多很好的理由,但我会尽量关注它们今天不那么受欢迎的原因。

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


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

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

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

其他一些观点:

  • 嵌入式服务器可以针对框架进行优化,或者与框架工具(例如播放控制台)更好地集成。
  • 并非所有云环境都带有可自定义的机器映像。使用专用软件进行云应用程序部署更简单,而不是编写初始化脚本来下载和设置servlet容器。
  • 我还没有找到一个Tomcat设置,它不会在你的应用程序的每次重新部署时出现perm gen space错误。如果您几乎可以立即在暂存和生产实例之间切换而不停机,那么花一点时间(重新)启动嵌入式服务器就没有问题。
  • 正如问题中已经提到的,最终用户运行应用程序非常方便。
  • 嵌入式服务器便于携带,便于开发。今天一切都很快,原型和MVP需要尽快创建和交付。没有人愿意花太多时间为每个开发人员设置一个环境。
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.