java - 跨 VM 分布层

标签 java architecture virtual-machine multi-tier

虽然这是一个以 Java 为中心的问题,但它确实适用于任何使用多层架构的系统。

在 3 层架构中,您通常有 3 层:

  • 客户端代码所在的客户端/表示层;和
  • 业务逻辑所在的中间件层;和
  • RDBMS 和其他数据密集型系统所在的data/eis

在 Java 领域,对于 Web 应用程序,这可能看起来像:

  • 应用程序服务器,例如 GlassFish,同时运行“Web 层”(WAR 包含 Web 应用程序中的客户端层)和“业务层”(EJB、中间件等。 );和
  • 包含数据层的 RDBMS 服务器

在虚拟化/集群环境中,这些应用程序(GlassFish、RBMBS,如 Oracle 或 PostgreSQL 等)将在 VM 上运行。

我的问题:在这些 VM 之间分配/分发此 3 层架构的标准方法是什么?意思是,以下任何一种“策略”都可能可行,但不是优先:

  1. 一个运行 GlassFish 和 RDBMS(所有 3 层)的 VM(假设所有 VM 都是 Ubuntu 服务器,因此成本/价格不计入等式)
  2. 两个虚拟机:一个运行 GlassFish 的应用程序服务器虚拟机,以及一个运行 PostgreSQL 的数据库服务器虚拟机
  3. 三个虚拟机:两个应用服务器虚拟机都运行 GlassFish,但是 1 个 GlassFish 实例只运行 WAR(网络层),而第二个 FlassFish 实例运行中间件/业务逻辑;然后是第三个数据库服务器

显然,如果所有服务器(所有层)都在同一个虚拟机上运行,​​它们可能会运行得更快或更高效,因为它们不会因网络延迟而陷入困境。但它们会在同一个虚拟机上,这需要我需要大型硬件来支持它们。此设置也可能存在安全问题。

各有利弊。我感兴趣的是什么策略最能实现以下目标:(1) 最大化吞吐量/速度,(2) 最适合集群/云环境,以及 (3) 最大化安全性。

提前致谢!

最佳答案

(1) maximizes throughput/speed,

这完全取决于您的应用程序。例如,数据库可能是您的瓶颈,在这种情况下,您在 JVM 中的工作非常重要。

(2) is best suited for a clustered/cloud environment

如果您要分发您的系统,您很可能想要分发您的表示层。这是因为他们所做的工作取决于客户的数量,而每个客户所做的工作在很大程度上是独立的。 (在表现层)

and (3) maximizes security.

拥有更多虚拟机并不能保证提高安全性。您的 JVM 应该已设置好,因此运行在其中的不同应用程序无论如何都是完全独立的。如果你想防止拒绝攻击,而你的后端服务被其他系统使用,你可能希望将它们分开,否则没有太大区别。

关于java - 跨 VM 分布层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8791902/

相关文章:

java - Hibernate二级缓存

java - 通知客户新创建的 itemId 的最佳实践

asp.net-mvc - ASP.NET MVC 和面向服务的架构

java - "empty statements"可能会(不会)抛出哪些 Java 错误和异常?

git - 如何将存储库部署到Google Cloud中的虚拟机

Java:用于保存不同类型基元的通用集合

java - Hibernate hikaricp 数据源

java - HttpURLConnection.getInputStream() 挂起并且永远不会完成

oop - OOP 中的适配器模式与依赖注入(inject)有什么区别?

c++ - 从主机向在 VirtualBox Linux 机器上运行的服务器发送 http 请求