使用Web Server + Application Server的Java EE应用程序

ilo*_*arn 16 java web-applications java-ee

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

由于Application Server能够处理这样的servlet/jsp吗?

这种服务器架构有哪些优点/缺点?

acd*_*ior 41

Apache Tomcat,JettySun 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容器+ EJB容器.(你可以在这里这里看到Tomcat和Jetty并不声称是JavaEE服务器,只是servlet(web)容器.)

JBoss Application Server使用JbossWeb(Apache Tomcat fork)作为其Web容器.它的EJB容器就是JBoss(它们除了"JBoss EJB容器"之外没有单独的名称).

其他人(IBM WebSphere,Oracle/BEA WebLogic,TomEE,Glassfish)也有他们的web容器+ EJB容器.

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

在下面的讨论中,只要它们出现,您就可以使用"Web容器"更改Tomcat,使用"具有完全功能的Java EE服务器"更改JBoss.(为清楚起见,我使用了产品名称.)

JavaEE服务器容器

Image:Java EE Server和容器 - 来源:Java EE教程.

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

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

如果你把Tomcat放在JBoss 之前,你实际上要做的就是 JBossWeb(Web容器,因此是每个Web应用程序的入口)之前放置一个Tomcat ,它总是在JBoss的EJB容器之前.如果我们谈论功能,那只是多余的,因为我们有两次相同的服务.

切换实现者或群集功能

如果将JBoss仅用于其EJB容器,那么 JBoss 之前放置Tomcat 是有意义的:那么,这里的选择将是Web容器实现者中的一个简单开关.

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

提供静态内容和安全问题

什么是常见的是将一个Web服务器(如Apache HTTPD或IIS)的Java Web容器之前.这有两个主要动机:

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

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