Java EE Application with Web Server + Application Server
Java EE应用程序是否需要使用Web服务器(例如SUN Java Web Server)来处理servlet / jsp请求并转发到IBM WebSphere或BEA WebLogic等应用程序服务器?
因为应用程序服务器也能够处理这样的 servlet/jsp?
这种服务器架构的优点/缺点是什么?
Java EE应用程序是否需要使用Web服务器(例如SUN Java Web Server)来处理servlet / jsp请求并转发到IBM WebSphere或BEA WebLogic等应用程序服务器?
因为应用程序服务器也能够处理这样的 servlet/jsp?
这种服务器架构的优点/缺点是什么?
Apache Tomcat,Jetty和Sun Java System Web Server只是Java Web(Servlet)容器,这意味着它们只能执行Servlets / JSP - 它们不提供完整的Java EE API堆栈。
因此,它们只能部署文件,而不能部署文件(这也包括带有 EJB 的模块),并且不支持开箱即用的一些 Java EE API,如 JSF 或 CDI。或其他功能/API。需要注意的是,由于 Java EE6,.war
文件可能包含 EJB。有关 .war 和 .
ear 的差异的更多信息
。.war
.ear
.jar
每个 Java EE 服务器都有一个 Web 容器 + EJB 容器。(你可以在这里和这里看到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 fork。(是的,Apache Tomcat似乎很受欢迎:)
在下面的讨论中,您可以随时使用“Web容器”更改Tomcat,并使用“完全可用的Java EE服务器”更改JBoss。(为了清楚起见,我使用了产品的名称。
图片:Java EE Server and containers - 来源:Java EE Tutorial。
让Java Web服务器(如Tomcat)处理Servlet / JSP调用并将更复杂的请求转发到应用程序服务器(如JBoss(或IBM WebSphere或BEA WebLogic)的(不)优势是什么?
如果你把一只Tomcat放在JBoss之前,你实际上正在做的是把一只Tomcat放在JBossWeb(Web容器,因此是每个Web应用程序的入口)之前,JBossWeb将始终在JBoss的EJB容器之前。如果我们谈论的是功能,那只是多余的,因为我们有相同的服务被交付两次。
如果 Tomcat 仅将 JBoss 用于其 EJB 容器,那么在 JBoss 之前放置一个 Tomcat 是有意义的:那么,这里的选择将是 Web 容器实现器中的一个简单的开关。
此外,如果Tomcat位于不同的网络节点(或多个Tomcat/节点),则可以应用集群功能(否则无法应用,因为JBossWeb和JBoss通常被视为一个,因此在同一台机器中)。
非常常见的是将Web服务器(例如Apache HTTPD或IIS)放在Java Web容器之前。这有两个主要动机:
如果想要增加安全性,那么在DMZ中使用Web容器是没有意义的:如果它正在提供应用程序(即,将文件部署到其中),应用程序仍然“容易受到攻击”;如果它只是转发请求/响应,那么Apache HTTPD是一个更好的选择!.war
Sun Java Web Server, IBM WebSphere Application Server, WebLogic, JBoss Application Server, Tomcat, Jetty...它们都是Java Web应用程序服务器,并做同样的事情 - 运行您的WAR或EAR打包应用程序(EAR用于“企业”,包含1个以上的WAR)。
如果设置中有两台服务器来运行一个应用程序,则可能是部署策略/设计中存在错误。
有多服务器设置的情况,但这些通常是负载平衡和代理设置,在Java应用程序服务器前面有Apache HTTP Server。
例如,您有一个 Tomcat 在端口 8080 上为您的应用程序提供服务,并且您希望使用 而不是 。你不能单独使用Tomcat做到这一点,因为Java不能低于端口1024(*)。为此,您需要在端口80上设置Apache HTTP Server,并将其配置为将所有流量从 重定向到 。http://myserver.com/myapp/
http://myserver.com:8080/myapp/
mod_proxy
/myapp
http://myserver.com:8080/myapp
*: 我不记得确切的数字,但它大约是1024。对于Linux来说也是如此,但对于Windows来说可能不是这样,自从我使用Windows设置以来已经有一段时间了。
更新:我的坏,我忘了强调这里描述的“作为系统运行服务”部分。