有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

jakarta ee Java ee应用程序与Web服务器+应用程序服务器

Java EE应用程序是否需要像SUN Java web Server这样的web服务器来处理servlet/jsp请求,并转发到IBM WebSphere或BEA WebLogic等应用程序服务器

既然应用服务器也能处理这样的servlet/jsp

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


共 (3) 个答案

  1. # 1 楼答案

    Sun Java Web服务器、IBM WebSphere应用服务器、WebLogic、JBoss应用服务器、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

  2. # 2 楼答案

    Apache TomcatJettySun Java System Web Server只是Java Web(Servlet)容器,这意味着它们只能执行Servlet/JSP——它们不提供完整的Java EE API堆栈

    因此,他们只能部署.war文件,而不能部署.ear(也包括带有EJB的.jar模块),并且不支持现成的一些Java EE API,如JSF或CDI。或其他功能/API需要注意的是,由于JavaEE6,^{} files may contain EJBsMore info on differences about ^{} and ^{}


    每个JavaEE服务器都有一个Web容器+EJB容器。 (您可以看到herehereTomcat和Jetty并不声称是JavaEE服务器,只是servlet(web)容器。)

    JBoss应用服务器使用JbossWeb(Apache Tomcat fork)作为其web容器。它的EJB容器是JBoss(除了“JBoss EJB容器”,它们没有单独的名称)

    其他公司(IBM WebSphere、Oracle/BEA WebLogic、TomEE、Glassfish)也有自己的web容器+EJB容器

    TomEE显然使用ApacheTomcat作为其web容器Glassfish也使用Apache Tomcat叉子。(是的,Apache Tomcat似乎非常受欢迎:)

    在下面的讨论中,无论何时出现,都可以将Tomcat更改为“Web容器”,将JBoss更改为“完全支持Java EE服务器”。(为了清晰起见,我使用了产品名称。)

    JavaEE Server Containers

    图片:JavaEE服务器和容器-来源:JavaEE教程

    What are the (dis)advantages of having Java Web Servers (such as Tomcat) handling the Servlet/JSP calls and forwarding more complex requests to Application Servers such as JBoss (or IBM WebSphere or BEA WebLogic)?

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

    如果将Tomcat放在JBoss的之前,那么实际操作是将Tomcat放在JBossWeb(web容器,因此是每个web应用程序的入口)之前,而JBoss的EJB容器将始终位于JBoss的EJB容器之前。如果我们谈论的是功能,那只是多余的,因为我们有两次提供相同的服务

    交换实现者或集群功能

    如果JBoss只将JBoss用于EJB容器,那么将Tomcat放在JBoss之前是有意义的:那么,这里的选择将是web容器实现器中的一个简单切换

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

    服务于静态内容和安全问题

    非常常见的是在Java web容器之前放置一个web服务器(如Apache HTTPD或IIS)。这主要有两个动机:

    • 使HTTPD服务于静态内容(如图像),并将其余内容转发给Java web容器。之所以这样做,是因为web服务器在交付静态内容时通常会得到更好的优化
    • 安全性:仅公开DMZ中的HTTPD。你可以在DMZ上设置一个ApacheHTTPD,并将所有内容简单地转发到Web容器(Tomcats等)和JavaEE服务器(JBosses等)

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

  3. # 3 楼答案

    由于应用服务器已经在板上包含Servlet容器,所以再增加一个Web服务器来处理传入的http请求是多余的

    然而,当我在项目中工作时,这些层是分开的。我们有JBoss服务器集群和Tomcat服务器集群。Tomcat通过RMI和负载平衡调用JBoss。这样做是为了安全(Jboss服务器位于VPN内)和可扩展性