带有 Web 服务器 + 应用程序服务器的 Java EE 应用程序

Posted

技术标签:

【中文标题】带有 Web 服务器 + 应用程序服务器的 Java EE 应用程序【英文标题】:Java EE Application with Web Server + Application Server 【发布时间】:2013-04-06 12:08:58 【问题描述】:

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) 容器,这意味着它们只能执行 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 容器之前。这样做的主要动机有两个:

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

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

【讨论】:

其他符合 Java EE 的服务器是 GlassfishTomEE 这样做的原因是,客户端“认为”将 Web 服务器用作 DMZ,应用程序服务器位于内部防火墙后面。 @optimus 这样做的原因是什么?在web容器之前放置一个web服务器还是在web容器之前放置一个web容器? @acdcjunior 关于在应用程序服务器前使用 Web 服务器的最后一点是很好的。我要强调的是,这绝对是跨多种语言的 Web 服务器的标准做法——Java、Python、Ruby 等。Web 服务器被称为代理、反向代理、前端服务器,有时也称为负载均衡器(如果它也是做负载均衡)。考虑到安全性、稳定性、性能和可管理性,这是一个好主意的原因有很多,但现在不是讨论它们的时候! 关于第一部分的注释:EJB bean 也可以被放入战争中。 war/ear 之间的区别与 EJB 无关。还要意识到 Servlet 容器和 Java EE AS(Web Profile 或完整)之间的区别不仅仅是 EJB。 Java EE 中还有 许多 其他 API!【参考方案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 服务器。

例如,您有一个 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。

【讨论】:

【参考方案3】:

既然应用服务器已经在板上包含了 Servlet 容器,那么再拥有一个处理传入 http 请求的 Web 服务器是多余的。

但是,一旦我参与了这个项目,这些层就被分开了。我们有 JBoss 服务器集群和单独的 Tomcat 服务器集群。 Tomcat 通过具有负载平衡的 RMI 调用 JBoss。这样做是为了安全(Jboss 服务器在 *** 中)和可扩展性。

【讨论】:

我正在做的项目,他们使用带有 Weblogic 插件的 SUN Java Web Server 来转发请求。 Tomcat 通过 RMI 调用 JBoss 是吧?这对安全有什么帮助?那么你将如何使用 JSF、JAX-RS、Bean Validation 等呢?这些在 web 层非常有用,而 Tomcat 没有。 不是每个人都需要 JSF、JAX-RS 等。在这种情况下,安全优势是相当有争议的。然而,很少有人担心。数据库与 Jboss 在同一台机器上。敏感的业务数据(配置、数据库等)位于位于 *** 中的机器上。如果不法分子以某种方式获得对公共 Tomcat 的访问权限,他将无法访问数据库。还有另一个 RMI 客户端必须与 Tomcat 一起调用 JBoss,核心业务逻辑在 JBoss。

以上是关于带有 Web 服务器 + 应用程序服务器的 Java EE 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

对于带有登录系统的 Web 应用程序,我是不是需要 OAuth 服务器实现?

带有 Web 服务器 + 应用程序服务器的 Java EE 应用程序

带有服务器推送的移动和桌面 Web 应用程序

带有无服务器 Web 应用程序的 Azure Front Door

带有嵌入式数据库和脚本的完整的小型 Web/应用程序服务器

JavaWebTomcat