Java EE 应用程序是否需要具有诸如 SUN Java Web Server 之类的 Web 服务器来处理 servlet/jsp 请求并转发到诸如 IBM WebSphere 或 BEA WebLogic 之类的应用程序服务器?
既然应用服务器也能够处理这样的 servlet/jsp?
这种服务器架构的优点/缺点是什么?
Java EE 应用程序是否需要具有诸如 SUN Java Web Server 之类的 Web 服务器来处理 servlet/jsp 请求并转发到诸如 IBM WebSphere 或 BEA WebLogic 之类的应用程序服务器?
既然应用服务器也能够处理这样的 servlet/jsp?
这种服务器架构的优点/缺点是什么?
Apache Tomcat、Jetty和Sun 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 服务器”,只要它们出现。(为了清楚起见,我使用了产品的名称。)
图片: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)。这样做的主要动机有两个:
如果想要增加安全性,那么在 DMZ 中使用 Web 容器是没有意义的:如果它正在为应用程序提供服务(即,将.war
文件部署到其中),那么应用程序仍然是“易受攻击的”;如果它只是转发请求/响应,那么 Apache HTTPD 是一个更好的选择!
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
为将所有流量/myapp
从http://myserver.com:8080/myapp
.
*:我不记得确切的数字,但大约是 1024。这适用于 Linux,但可能不适用于 Windows,我已经有一段时间没有使用 Windows 设置了。
更新:我的错,我忘了强调这里描述 的“作为系统服务运行”部分。
好吧,既然应用服务器已经在板上包含了 Servlet 容器,那么再拥有一个处理传入 http 请求的 Web 服务器是多余的。
然而,一旦我参与了这个项目,这些层是分开的。我们有 JBoss 服务器集群和独立的 Tomcat 服务器集群。Tomcat 通过具有负载平衡的 RMI 调用 JBoss。这样做是为了安全(Jboss 服务器在 VPN 中)和可扩展性。