【问题标题】:Deploy to web container, bundle web container or embed web container部署到 Web 容器、捆绑 Web 容器或嵌入 Web 容器
【发布时间】:2010-12-28 18:37:41
【问题描述】:

我正在开发一个应用程序,该应用程序需要尽可能简单地为最终用户安装。虽然最终用户可能是 Linux 用户(或销售工程师),但他们对 Tomcat、Jetty 等一无所知,我认为他们也不应该了解。

所以我看到了 3 种部署应用程序的方法。我还应该指出,这是我必须部署的第一个具有 Web 界面的应用程序,所以我之前没有真正遇到过这个问题。

首先是将应用程序部署到现有的 Web 容器中。由于我们只部署到 Suse 或 RedHat,这似乎很容易做到。但是,我们对在一个 Web 容器中运行多个应用程序的想法并不感兴趣。仅删除一个应用程序变得更加困难。

下一个选项是捆绑 Tomcat 或 Jetty,并让启动/关闭脚本启动我们捆绑的 Web 容器。

或者第三个,嵌入。这可能会提供与第二个选项相同的用户体验。

我很好奇其他人在遇到这个问题时会怎么做,以使其对最终用户尽可能地万无一失。

我几乎排除了部署到现有 Web 容器的可能性,因为我们通常喜欢设置每个应用程序的资源限制和 CPU 亲和性,我相信这会影响部署到 Web 容器/应用程序服务器中的所有应用程序,而不仅仅是特定的应用程序.

谢谢。

【问题讨论】:

  • 感谢您的回答。似乎捆绑(或在某些情况下嵌入)是前进的方式。

标签: java tomcat jetty


【解决方案1】:

部署多个 war 文件(或完整 Java EE 应用服务器的 ear 文件)曾经是一个承诺,但在实践中并没有很好地发挥作用。

一个主要问题是,尽管取得了重大进展,但 EAR 的 WAR 热重载仍然存在问题。内存泄漏、资源泄漏、类加载器问题……它们不断发生。因此,最安全的重新部署方法是重新启动整个 servlet 容器或应用程序服务器,但这会导致所有其他在其上运行的应用程序都停止运行。

将多个应用程序部署到单个 AS 的第二个问题是它们之间只有一层薄薄的隔离。应用程序可以从其他应用程序访问 JNDI 中的资源。这对于合作的应用程序来说可能不是问题,但对于可能相互敌对的应用程序来说,这确实是一个问题。

因此,一般来说,servlet 容器不能替代多任务、隔离的操作系统。

随着 Xen 等廉价且高效的虚拟化产品的出现,每个 servlet 容器只拥有一个应用程序(实际上是捆绑它们)并将它们部署到 Xen 客户端似乎是一个更好的选择。

这样做的另一个优点是它提供了一种更简单的途径来升级您的应用程序所依赖的库。如果您将 Tomcat 6 的固定安装视为部署平台,那么单个应用程序不能仅从 Tomcat 7 升级到 Servlet 3.0,因为这将影响在同一 Tomcat 上运行的所有其他应用程序。这对于像 JBoss AS 这样的完整 Java EE 堆栈来说更为重要,因为这些库捆绑了更多的库。

实际上,这通常意味着使用运行多个应用程序的固定 Tomcat,您永远无法升级您的应用程序以利用 Tomcat 提供的较新的库/api,因为总会有一些其他应用程序出于某种原因或其他原因无法升级。这很快就会变成一场噩梦。

【讨论】:

  • 您提到的许多缺点也可能是优点,具体取决于具体情况。如果您想要 100% 隔离,您所说的是正确的,但在许多情况下,目的是有目的地分享。
  • 是的,如果您的“应用程序”不是真正的单独应用程序,而是更像协作应用程序模块,那么您确实可能想要共享资源。在某种程度上,部署多个 EAR 或 WAR 的能力可以被视为单个应用程序中的额外分层。
  • 对于在同一硬件上托管多个 JVM,您会推荐哪种占用空间最小?
  • 这取决于您的设置。单个操作系统上的多个 JVM 可以为您节省一些额外操作系统的内存开销,但您可能会在配置每个 Tomcat 或 JBoss AS 等以使用不同的端口集时遇到更多麻烦。但是现在内存非常便宜,因此在入门级服务器中放置 8GB 内存几乎不比 2GB 贵。如果您托管 8 个 XEN 客户端,这将为您提供每个 XEN 客户端 1GB 和每个 JVM 大约 768MB。如果您的应用程序真的很简单,那么每个 JVM 可能会低至 64 MB,每个 XEN 客户端可能会低至 128 MB。这将允许您在单个服务器上运行大约 64 个应用程序。
【解决方案2】:

看看Hudson build engine.

它既可以部署到现有的 Web 容器中,也可以简单地使用“java -jar hudson.war”运行。对于 Windows,如果以管理员权限运行,它可以将自己注册为服务。

它使用专为这种用途而设计的Winstone servlet container 做到这一点。

【讨论】:

    【解决方案3】:

    在我看来,将 Web 应用程序与 servlet 容器(Tomcat 或 Jetty)一起分发并不少见。您获得的是:完全控制您的 Web 应用程序的配置,最终用户无需关心配置细节。但是,缺点之一是安装包体积增大。

    【讨论】:

      猜你喜欢
      • 2016-11-15
      • 1970-01-01
      • 1970-01-01
      • 2013-06-15
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-25
      相关资源
      最近更新 更多