build议部署战争文件vs可执行jar与embedded式容器

在java空间中似乎有一种趋势,就是从一个war文件(或ear文件)的forms,将java web应用程序部署到一个java servlet容器(或应用程序服务器),而不是将应用程序打包为一个可执行的jar像docker这样的embedded式servlet / HTTP服务器。 我的意思是,更新的框架影响了新应用程序的开发和部署方式,而不是如何将应用程序交付给最终用户(例如,我得到了为什么Jenkins使用embedded式容器,非常容易抓取和移动)。 采用可执行jar选项的框架示例: Dropwizard , Spring Boot和Play (它不能在servlet容器上运行,但是HTTP服务器被embedded)。

我的问题是,从我们已经将我们的应用程序(主要是Struts2)部署到单个tomcat应用程序服务器的环境中,如果我们计划使用embedded式容器方法,需要做出什么样的更改,最佳实践或考虑? 目前,我们在单个tomcat服务器上运行大约10个自主开发的应用程序,对于这些小型应用程序来说,共享资源并在一台服务器上pipe理的能力是非常好的。 我们的应用程序不打算分发给最终用户在其环境中运行。 然而,如果我们决定利用更新的Java框架,那么这种方法是否会改变呢? 越来越多的云部署(例如,Heroku)的使用促成了可执行jar的转变吗?

如果您在Play部署方式中pipe理多个应用程序的经验与在单个应用程序服务器上部署传统战争文件的经验相同,请分享您的洞察力。

一个有趣的问题。 这只是我关于这个话题的看法,所以一切都要用一粒盐。 我偶尔使用servlet容器和embedded式服务器部署和pipe理应用程序。 我相信使用servlet容器还有很多好的理由,但是我会尽量专注于为什么他们今天不受欢迎。

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


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

另一方面,专用服务器通常function强大,但具有固定大小,因此您可以在单台计算机上运行多个应用程序,以最大限度地利用资源。 使用servlet容器让你理智。 虽然这很难扩展。 云中的Servlet容器似乎不是很有用。 如果具有不同负载的多个应用程序在同一个容器中运行,那么如果创build多个实例,则可能会浪费资源。

非云的东西不卖。 很多框架默认都是可扩展的,所以可以很容易地将它们部署到云端。 embedded式服务器的部署和运行速度非常快,所以它们看起来是一个合理的解 Servlet容器通常仍然被支持,但是需要更复杂的设置。

其他一些观点:

  • embedded式服务器可以针对框架进行优化,或者与框架工具(如游戏控制台)更好地集成。
  • 并非所有的云环境都带有可定制的机器映像。 编写初始化脚本来下载和设置新机器上的servlet容器并不好玩。
  • 我还没有find一个Tomcat安装程序,每次重新部署应用程序时,都不会用perm gen space错误来迎接您。 如果几乎可以立即在分段和生产实例之间切换,而不需要任何停机时间,则重新启动embedded式服务器的时间不会太长。
  • 正如问题中已经提到的,最终用户只需运行应用程序就非常方便。
  • embedded式服务器是便携式的,便于开发。 今天一切都很快 ,原型和MVP需要尽快创build和交付。 没有人愿意花太多时间为每个开发者build立一个环境。