Java EE Application with Web Server + Application Server

2022-09-02 23:27:02

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

因为应用程序服务器也能够处理这样的 servlet/jsp?

这种服务器架构的优点/缺点是什么?


答案 1

Apache TomcatJettySun 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。(为了清楚起见,我使用了产品的名称。

JavaEE Server Containers

图片: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容器之前。这有两个主要动机:

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

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


答案 2

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/myapphttp://myserver.com:8080/myapp

*: 我不记得确切的数字,但它大约是1024。对于Linux来说也是如此,但对于Windows来说可能不是这样,自从我使用Windows设置以来已经有一段时间了。

更新:我的坏,我忘了强调这里描述的“作为系统运行服务”部分。


推荐