【问题标题】:How to distribute a j2ee application on multiple servers?如何在多个服务器上分发 j2ee 应用程序?
【发布时间】:2011-04-29 20:15:26
【问题描述】:

我使用 JSP+Struts2+Tomcat6+Hibernate+MySQL 作为我的 J2EE 开发环境。由于该项目的大规模和即将出现的性能问题,决定将该项目部署在多台服务器上。 由于该项目是在 3 层架构中开发的,我们希望为每一层专门分配一台单独的机器,并通过 GigaBit Ethenrnet 连接将它们连接起来。所以我们需要一个 DB-Server(MySQL)、一个 Logic-Server(Struts2+POJOs)和一个 Web-Server。

我想 DB-Server 和 Logic-Server 之间的通信不会有问题,但是连接 web-server 和 Logic-Server 对我来说似乎有点莫名其妙。考虑到我们可能会在下一阶段增加每层的服务器机器数量,在这种情况下我有什么选择?

任何想法都将受到高度赞赏!

[编辑]

Tomcat 是 Logic-Server 的一部分,它位于 POJO 和 struts 所在的位置,我所说的 web-server 是一个前端服务器,它接收用户的请求并将它们分派到 Logic-Server。 另一方面,我们可能想要使用多个逻辑服务器。有没有可能?

顺便问一下,JMS 在这里有什么帮助吗?

【问题讨论】:

    标签: java performance deployment jakarta-ee distribution


    【解决方案1】:

    逻辑也需要在 Tomcat 服务器上进行。没有 Web 服务器的 Struts 毫无意义。

    或者您的意思是“理解 HTTP 的哑文件服务器”中的“Web 服务器”?在这种情况下,您根本不连接它们。 Web 浏览器会为您执行此操作:JSP/Servlet 代码会将图像和其他静态内容的 URL 发送到浏览器,浏览器将使用这些 URL 直接从“Web 服务器”下载数据。

    您绝对不希望“逻辑服务器”下载并提供这些内容。

    【讨论】:

    • @Aaaron:你对 tomcat 的看法绝对正确,我编辑了这个问题以防止下一个观众产生错误的想法。我想我会同意你关于“理解 HTTP 的哑文件服务器”的看法。那么这是怎么回事呢?只是 JSP 页面?你能更详细地解释你的想法吗?
    • 转储 HTTP 服务器提供 CSS、静态 javascript(不是您在 JSP 中生成的部分)、图像、徽标以及任何未生成的内容。 JSP 与 POJO 一起在逻辑服务器上运行。
    • 谢谢哥们,这似乎是合理的,但对于我拥有的 JSP 页面来说有点麻烦。我会考虑更多
    【解决方案2】:

    您甚至可以将 Struts 应用程序拆分为“逻辑服务器”和 Web 服务器吗?

    Tomcat 是一个应用服务器,因为它可以运行您的逻辑并为您的页面提供服务。 如果您真的想将逻辑运行负载分配到另一台服务器上,请尝试实现面向服务的架构。

    我的经验仅限于使用:JSF 用于前端和一些日期操作(用于演示),IBM Websphere 用于逻辑(这些流程是在 Websphere Integration Developer 中设计的,而不是纯 Java),以及用于 DB 的 Oracle。所有这些服务器都托管在不同的机器上。

    在您的情况下,您可以使用 Java Web 应用程序来执行您的逻辑,并且它可以在另一个 Tomcat 服务器上运行(与您的前端应用程序的服务器分开)。在这种情况下,您会将函数公开为 Web 服务,并让前端应用程序调用它们。

    【讨论】:

    • Salam,我认为你是对的,分离 tomcat 和 POJO 甚至是不可能的,我一时糊涂了!我编辑了这个问题。你可能想重新考虑最后一部分。
    • 我不确定您接受请求并将其分派到服务器是什么意思。这是否意味着您想要一个表单页面(前端),将数据发布或获取到将其插入数据库(数据层)的 java 类(逻辑层)?在这种情况下,将它们放在不同的服务器上是没有意义的。但是,如果您的前端基于服务器的处理负载很大(在您的核心逻辑运行并返回数据之后),您可以将它们保留在不同的服务器上。
    • 你明白了。这就是我的想法。一个前端服务器,它向 java 类(逻辑层)发送和获取(执行操作)数据,逻辑层与单独的 DB 层通信。由于会有大量的用户和大量的请求,最好在单独的前端服务器上进行管理,减轻逻辑服务器的负载。还是不同意?
    • 同意。您的 servlet 将接收 POSTS 和 GETS,您可以将它们保存在另一台服务器上。我不确定有多少 Struts 会在这次分裂中幸存下来。
    【解决方案3】:

    根据层分布应用程序不一定是一个好主意。与单个 JVM 中的通信相比,网络通信速度较慢。出于这个原因,您希望最小化不同机器之间的通信。这通常通过提供粗粒度接口来实现,例如

    interface User
    {
      void setAddress(String name,
                      String street,
                      String zip,
                      String city,
                      String country);
    }
    

    而不是

    interface User
    {
      void setName(String name);
      void setStreet(String street);
      void setZip(String zip);
      void setCity(String city);
      void setCountry(String country);
    }
    

    合理的是,如果您更改 User 对象中的一条信息,其他部分也可能会更改。然后,粗粒度接口确保网络上的方法调用更少。

    【讨论】:

    • -1 超过四个参数的方法很脆弱,难以测试并且风格不好。另外,答案与问题无关。 :-)
    • @Aaron 您提到的 four 是任意的。其他消息来源说六个。另外,答案与问题相关,因为它说明了在多台服务器上分发 j2ee 应用程序时需要考虑什么。如果您认为在多个服务器上分发 j2ee 应用程序时不需要考虑粗粒度接口,那么您的 -1 将是合理的。
    • 感谢您的回答,但使用粗粒度接口并不是一个可行的选择,因为首先它需要对代码进行大量更改,而第二个 hibernate 不会那么友好。
    • @SJ.Jafari:粗粒度接口不会取代细粒度接口。他们补充他们。它们专门用于跨机器传输数据。详情请参阅P of EAA: Remote FacadeCore J2EE Patterns: Transfer Object
    • 有意思,我会考虑的。
    猜你喜欢
    • 2013-07-15
    • 1970-01-01
    • 2012-11-06
    • 2023-03-06
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 2014-03-31
    • 1970-01-01
    相关资源
    最近更新 更多