尽管这是一个以 Java 为中心的问题,但它确实适用于任何使用多层架构的系统。
在 3 层架构中,通常有 3 层:
- 客户端代码所在的客户端/表示层;和
- 业务逻辑所在的中间件层;和
- RDBMS 和其他数据密集型系统所在的数据/eis层
在 Java 领域,对于 Web 应用程序,这可能如下所示:
- 一个应用服务器,例如同时
GlassFish
运行“Web 层”(WAR 构成 Web 应用程序中的客户端层)和“业务层”(EJB、中间件等);和 - 包含数据层的 RDBMS 服务器
在虚拟化/集群环境中,这些应用程序(GlassFish、RBMBS,如 Oracle 或 PostgreSQL 等)将在 VM 上运行。
我的问题:在这些虚拟机之间分配/分布这个 3 层架构的标准方法是什么?意思是,以下任何一种“策略”都可能是可行的,但不是优先的:
- 一台同时运行 GlassFish 和 RDBMS(所有 3 层)的虚拟机(假设所有虚拟机都是 Ubuntu 服务器,因此成本/价格不考虑在内)
- 两个虚拟机:一个运行 GlassFish 的应用服务器虚拟机和一个运行 PostgreSQL 等数据库服务器虚拟机
- 三个虚拟机:两个应用服务器虚拟机都运行 GlassFish,但是 1 个 GlassFish 实例仅运行 WAR(Web 层),而第二个 FlassFish 实例运行中间件/业务逻辑;然后是第三个数据库服务器
显然,如果所有服务器(所有层)都在同一个 VM 上运行,它们可能会运行得更快或更高效,因为它们不会因网络延迟而陷入困境。但是它们会在同一个虚拟机上,这需要我需要大型硬件来支持它们。此设置可能还存在安全问题。
每个都有优点/缺点。我对哪些策略最能实现以下目标感兴趣:(1) 最大限度地提高吞吐量/速度,(2) 最适合集群/云环境,以及 (3) 最大限度地提高安全性。
提前致谢!