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

时间:2014-05-05 17:21:39

标签: java playframework war spring-boot dropwizard

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

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

如果您在单一应用程序服务器上以Play风格部署管理多个应用程序与传统war文件部署相关的经验,请分享您的见解。

1 个答案:

答案 0 :(得分:74)

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

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


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

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

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

其他一些观点:

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