17

Java EE 应用程序是否需要具有诸如 SUN Java Web Server 之类的 Web 服务器来处理 servlet/jsp 请求并转发到诸如 IBM WebSphere 或 BEA WebLogic 之类的应用程序服务器?

既然应用服务器也能够处理这样的 servlet/jsp?

这种服务器架构的优点/缺点是什么?

4

3 回答 3

40

Apache TomcatJettySun Java System Web Server只是 Java Web (Servlet) 容器,这意味着它们只能执行 Servlets/JSP——它们不提供完整的 Java EE API 堆栈。

因此,它们只能部署.war文件,而不是.ear(也包括.jar带有 EJB 的模块),并且不支持开箱即用的一些 Java EE API,如 JSF 或 CDI。或其他功能/API。需要注意的是,从 Java EE6 开始,.war文件可能包含 EJB有关和的差异的更多信息.war.ear


每个 Java EE 服务器都有一个Web Container + EJB Container。(您可以在此处此处看到 Tomcat 和 Jetty 并不声称是 JavaEE 服务器,只是 servlet (web) 容器。)

JBoss Application Server使用JbossWeb(一个 Apache Tomcat 分支)作为其 Web 容器。它的 EJB 容器就是 JBoss(除了“JBoss EJB Container”之外,它们没有单独的名称)。

其他的(IBM WebSphere、Oracle/BEA WebLogic、TomEE、Glassfish)也有他们的 Web 容器 + EJB 容器。

TomEE 显然使用 Apache Tomcat 作为其 Web 容器。Glassfish还使用 Apache Tomcat 分支。(是的,Apache Tomcat 似乎很受欢迎 :)

在下面的讨论中,您可以将 Tomcat 更改为“Web Container”,将 JBoss 更改为“功能齐全的 Java EE 服务器”,只要它们出现。(为了清楚起见,我使用了产品的名称。)

JavaEE 服务器容器

图片:Java EE 服务器和容器 - 来源:Java EE 教程。

让 Java Web 服务器(例如 Tomcat)处理 Servlet/JSP 调用并将更复杂的请求转发到 JBoss(或 IBM WebSphere 或 BEA WebLogic)等应用服务器有什么(缺点)优势?

从功能的角度来看,没有有效的收益

如果您将 Tomcat 放在JBoss之前,您实际上是在将 Tomcat 放在JBossWeb(Web 容器,因此是每个 Web 应用程序的入口)之前,JBossWeb(Web 容器,因此是每个 Web 应用程序的入口)始终位于 JBoss 的 EJB 容器之前。如果我们谈论的是功能,那只是多余的,因为我们有两次交付相同的服务。

切换实现者或集群功能

如果仅将 JBoss 用于其 EJB 容器,则在 JBoss之前放置 Tomcat是有意义的:那么,此处的选择将是 Web 容器实现器中的简单切换。

此外,如果 Tomcat 位于不同的网络节点(或多个 Tomcat/节点),则可以应用集群功能(否则无法应用,因为 JBossWeb 和 JBoss 通常被视为一个,因此位于同一台机器上) .

提供静态内容和安全问题

很常见的是Java Web Container 之前放置一个 Web 服务器(例如 Apache HTTPD 或 IIS)。这样做的主要动机有两个:

  • 使 HTTPD 提供静态内容(例如图像)并将其余内容转发到 Java Web 容器。这样做是因为 Web 服务器通常在交付静态内容的任务中得到了更好的优化。
  • 安全性:仅在 DMZ 中公开 HTTPD。可以在 DMZ 设置 Apache HTTPD,并使其简单地将所有内容转发到 Web 容器(Tomcat 等)和 JavaEE 服务器(JBoss 等)。

如果想要增加安全性,那么在 DMZ 中使用 Web 容器是没有意义的:如果它正在为应用程序提供服务(即,将.war文件部署到其中),那么应用程序仍然是“易受攻击的”;如果它只是转发请求/响应,那么 Apache HTTPD 是一个更好的选择!

于 2013-04-14T09:10:36.783 回答
3

Sun Java Web Server、IBM WebSphere Application Server、WebLogic、JBoss Application Server、Tomcat、Jetty……它们都是Java Web Application Server,做同样的事情——运行 WAR 或 EAR 打包的应用程序(EAR 代表“企业”,包含 1 个以上的 WAR)。

如果您的设置中有两台服务器来运行一个应用程序,那么您的部署策略/设计可能有问题。

存在多服务器设置的情况,但通常是负载平衡和代理设置,在 Java 应用程序服务器前面有 Apache HTTP 服务器。

例如,您有一个 Tomcat 在端口 8080 上为您的应用程序提供服务,并且您希望http://myserver.com/myapp/使用http://myserver.com:8080/myapp/. 你不能单独使用 Tomcat 来做到这一点,因为Java 不能低于端口 1024 (*)。为此,您需要在端口 80 上设置 Apache HTTP Server 并将其配置mod_proxy为将所有流量/myapphttp://myserver.com:8080/myapp.

*:我不记得确切的数字,但大约是 1024。这适用于 Linux,但可能不适用于 Windows,我已经有一段时间没有使用 Windows 设置了。

更新:我的错,我忘了强调这里描述 的“作为系统服务运行”部分。

于 2013-04-14T09:01:21.793 回答
1

好吧,既然应用服务器已经在板上包含了 Servlet 容器,那么再拥有一个处理传入 http 请求的 Web 服务器是多余的。

然而,一旦我参与了这个项目,这些层是分开的。我们有 JBoss 服务器集群和独立的 Tomcat 服务器集群。Tomcat 通过具有负载平衡的 RMI 调用 JBoss。这样做是为了安全(Jboss 服务器在 VPN 中)和可扩展性。

于 2013-04-14T09:30:44.433 回答