【发布时间】:2013-04-06 12:08:58
【问题描述】:
Java EE 应用程序是否需要具有 Web 服务器(例如 SUN Java Web Server)来处理 servlet/jsp 请求并转发到应用程序服务器(例如 IBM WebSphere 或 BEA WebLogic)?
既然应用服务器也能够处理这样的 servlet/jsp?
这种服务器架构的优点/缺点是什么?
【问题讨论】:
标签: java jakarta-ee web-applications
Java EE 应用程序是否需要具有 Web 服务器(例如 SUN Java Web Server)来处理 servlet/jsp 请求并转发到应用程序服务器(例如 IBM WebSphere 或 BEA WebLogic)?
既然应用服务器也能够处理这样的 servlet/jsp?
这种服务器架构的优点/缺点是什么?
【问题讨论】:
标签: java jakarta-ee web-applications
Apache Tomcat、Jetty 和 Sun Java System Web Server 只是 Java Web (Servlet) 容器,这意味着它们只能执行 Servlet/ JSP - 它们不提供完整的 Java EE API 堆栈。
因此,他们只能部署 .war 文件,而不是 .ear(这也将包括带有 EJB 的 .jar 模块),并且不支持开箱即用的一些 Java EE API,如 JSF 或 CDI。或其他功能/API。 需要注意的是,从 Java EE6 开始,.war files may contain EJBs。 More info on differences about .war and .ear.
每个 Java EE 服务器都有一个 Web 容器 + EJB 容器。
(您可以看到 here 和 here 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 容器”,将 JBoss 更改为“功能齐全的 Java EE 服务器”,只要它们出现。 (为了清楚起见,我使用了产品的名称。)
图片:Java EE 服务器和容器 - 来源:Java EE 教程。
让 Java Web 服务器(如 Tomcat)处理 Servlet/JSP 调用并将更复杂的请求转发到 JBoss(或 IBM WebSphere 或 BEA WebLogic)等应用服务器有哪些(缺点)优势?
如果您将 Tomcat before 放置在 JBoss 之前,那么您实际上是在将 Tomcat before 放置在 JBossWeb(Web 容器,因此是每个 Web 应用程序的入口)它总是在 JBoss 的 EJB 容器之前。如果我们谈论的是功能,那只是多余的,因为我们有两次交付相同的服务。
在 JBoss 之前放置一个 Tomcat 如果 JBoss 仅用于其 EJB 容器,则它们是有意义的:那么,此处的选择将是 Web 容器实现器中的一个简单切换。
此外,如果 Tomcat 位于不同的网络节点(或多个 Tomcat/节点),则可以应用集群功能(否则无法应用,因为 JBossWeb 和 JBoss 通常被视为一个,因此进入同一台机器)。
非常常见的是放置一个 Web 服务器(例如 Apache HTTPD 或 IIS)在 Java Web 容器之前。这样做的主要动机有两个:
如果想要增加安全性,那么在 DMZ 中使用 Web 容器是没有意义的:如果它正在为应用程序提供服务(也就是说,有.war 文件部署到它),应用程序仍然是“脆弱的”;如果它只是转发请求/响应,那么 Apache HTTPD 是一个更好的选择!
【讨论】:
Glassfish 和 TomEE。
Sun Java Web Server、IBM WebSphere Application Server、WebLogic、JBoss Application Server、Tomcat、Jetty...它们都是 Java Web 应用服务器并且做同样的事情——运行你的 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 服务器并配置其 mod_proxy 以将所有流量从 /myapp 重定向到 http://myserver.com:8080/myapp。
*:我不记得确切的数字,但大约是 1024。这适用于 Linux,但可能不适用于 Windows,我已经有一段时间没有使用 Windows 设置了。
更新: 我的错,我忘了强调“作为系统服务运行”部分为described here。
【讨论】:
既然应用服务器已经在板上包含了 Servlet 容器,那么再拥有一个处理传入 http 请求的 Web 服务器是多余的。
但是,一旦我参与了这个项目,这些层就被分开了。我们有 JBoss 服务器集群和单独的 Tomcat 服务器集群。 Tomcat 通过具有负载平衡的 RMI 调用 JBoss。这样做是为了安全(Jboss 服务器在 VPN 中)和可扩展性。
【讨论】: