Java EE应用程序是否需要Web服务器(如SUN Java Web Server)来处理servlet/jsp请求并转发到应用服务器(如IBM WebSphere或BEA WebLogic)?
既然应用服务器也能够处理这样的servlet/jsp,那么是否有必要使用Web服务器呢?
这种服务器架构的优缺点是什么?
Java EE应用程序是否需要Web服务器(如SUN Java Web Server)来处理servlet/jsp请求并转发到应用服务器(如IBM WebSphere或BEA WebLogic)?
既然应用服务器也能够处理这样的servlet/jsp,那么是否有必要使用Web服务器呢?
这种服务器架构的优缺点是什么?
Apache Tomcat、Jetty 和 Sun Java System Web Server 只是Java Web(Servlet)容器,意味着它们只能执行Servlets/JSP - 它们不提供完整的Java EE API堆栈。
因此,它们只能部署.war
文件,而不能部署.ear
(这也包括带有EJB的.jar
模块),并且不支持一些Java EE API,如JSF或CDI等。或其他功能/API。 需要注意的是,自Java EE6以来,.war
文件可以包含EJBs。有关.war
和.ear
差异的更多信息。
每个Java EE服务器都有一个Web容器+ EJB容器。
(您可以在此处和此处看到Tomcat和Jetty并未声称自己是JavaEE服务器,只是Servlet(Web)容器。)
JBoss应用服务器使用JbossWeb(一个Apache Tomcat分支)作为其Web容器。其EJB容器是JBoss(除了“JBoss EJB容器”之外,它们没有单独的名称)。
其他服务器(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 Web服务器(如Tomcat)处理Servlet/JSP调用并将更复杂的请求转发到应用程序服务器(如JBoss或IBM WebSphere或BEA WebLogic)有何(不)优势?
如果您将Tomcat放置在JBoss之前,实际上是将Tomcat放置在JBossWeb(Web容器,因此是每个Web应用程序的入口)之前,它始终位于JBoss的EJB容器之前。如果我们谈论功能,那只是多余的,因为我们拥有两次提供相同服务的机会。
如果他们仅使用JBoss的EJB容器,则在JBoss之前放置Tomcat可能是有意义的:在这种情况下,选择是切换Web容器实现者。
此外,如果Tomcat位于不同的网络节点上(或多个Tomcat/节点),则可以应用群集能力(否则无法应用,因为JBossWeb和JBoss通常被视为一个并因此在同一台机器上运行)。
非常普遍的是将Web服务器(如Apache HTTPD或IIS)放置在Java Web容器之前。这样做有两个主要动机:
如果想要增加安全性,就没有必要在DMZ中使用Web容器:如果它正在提供应用程序(也就是部署了.war
文件),那么这些应用程序仍然“有漏洞”;如果它只是转发请求/响应,则Apache HTTPD是更好的选择!
http://myserver.com/myapp/
而不是 http://myserver.com:8080/myapp/
。您不能仅使用 Tomcat 实现此目的,因为 Java 无法低于端口 1024 (*)。为了实现这一点,您需要在端口 80 上设置 Apache HTTP Server,并配置其 mod_proxy
将所有流量从 /myapp
重定向到 http://myserver.com:8080/myapp
。既然应用服务器已经在内部包含了Servlet容器,那么再有一个处理传入http请求的Web服务器是多余的。
然而,在我参与的某个项目中,这些层被分离了。我们有一组JBoss服务器和一个单独的Tomcat服务器集群。Tomcat通过RMI调用JBoss并进行负载平衡。这样做是为了安全性(JBoss服务器在VPN内)和可扩展性。
Glassfish
和TomEE
。 - Menno