什么是 N 层架构?

Posted

技术标签:

【中文标题】什么是 N 层架构?【英文标题】:What is N-Tier architecture? 【发布时间】:2010-09-23 15:42:42 【问题描述】:

我最近看到不少开发人员职位发布,其中包含或多或少这样的句子:“必须具有 N-Tier 架构经验”或“必须能够开发 N-Tier 应用程序”。

这让我问,什么是 N-Tier 架构?如何获得经验?

【问题讨论】:

有趣的是,另一篇文章也在询问 N-Tier 架构是什么,但答案完全不同。 ***.com/questions/7271165/…。似乎有用于软件的 N 层架构和用于硬件的 N 层架构。 【参考方案1】:

据我了解,N-Tier 使用单独的物理机将业务逻辑、客户端访问和数据相互分离。理论是其中一个可以独立于其他更新。

【讨论】:

【参考方案2】:

这是一个流行词,指的是普通 Web 架构之类的东西,例如 javascript - ASP.Net - 中间件 - 数据库层。这些东西中的每一个都是一个“层”。

【讨论】:

【参考方案3】:

Wikipedia:

在软件工程中,多层 架构(通常称为 n 层架构)是一个 客户端-服务器架构,其中, 演示文稿,应用程序 处理和数据管理是 逻辑上分离的进程。为了 例如,一个应用程序使用 服务数据请求的中间件 用户和数据库之间采用 多层架构。最多 广泛使用“多层 架构”是指三层 架构。

什么算作“层”是有争议的,但在我看来,它至少需要跨越流程边界。或者它被称为图层。但是,它不需要在物理上不同的机器中。虽然我不推荐它,但您可以在同一个盒子上托管逻辑层和数据库。

编辑:其中一个含义是表示层和逻辑层(有时称为业务逻辑层)需要通过不可靠、缓慢和/或不安全的网络“跨线”跨越机器边界.这与简单的桌面应用程序(其中数据与文件位于同一台机器上)或您可以直接访问数据库的 Web 应用程序非常不同。

对于 n 层编程,您需要将数据打包成一种称为“数据集”的可传输形式,然后通过网络传输它们。 .NET 的 DataSet 类或像 SOAP 这样的 Web 服务协议很少有这样的尝试让物体飞过网络。

【讨论】:

“3-tiers”和“N-tiers”有区别吗? 这取决于您如何计算“层”(逻辑层、物理层等),但编写应用程序时可能很容易涉及超过 3 个进程。 UI、UI 平台(如 Eclipse RCP)、Web 服务、BLL、DAL、数据库、身份验证服务、报告服务、分析服务...... @chakrit:在我的时代(我老了),更多的是 2 层(客户端-服务器)自动指代 n 层。 @EugeneYokota - 据说 tiers 将代表架构中的 物理部分(可能会或可能不会进一步划分,例如在一个集群),layers 将引用应用程序组件的逻辑分组 有人告诉我一些看起来非常相似但层是表示层 - 服务层 - 集成/数据层的东西。你知道这些只是与上面显示的架构相同的事物的不同词还是不同的词?据我所知,它们看起来是一样的,但我想确定一下。【参考方案4】:

这取决于您如何将表示层与核心业务逻辑和数据访问分开 (Wikipedia)

3-tier 表示表示层 + 组件层 + 数据访问层。 N 层是指在这些层之外添加其他层,通常是为了获得额外的模块化、可配置性或与其他系统的互操作性。

【讨论】:

实际上,如果其中一个层级由远程方托管,例如支付处理器,则该层级可能不是那么“不必要” 嗯。 “层”和“服务”之间存在巨大差异。 N-Tier 通常用于表示对于给定的层,高于它的任何东西都必须通过它才能访问较低级别的服务。如果它们是并行的,我会称它们为服务而不是层。 在构建通常的 MCV(一种 3 层架构)时,可以决定使用双层接口来实现 MCV,这样实际上就可以替换特定层而无需修改甚至一行的代码。我们经常看到这样做的好处,例如在您希望能够使用多个数据库的情况下(在这种情况下,您在控制层和数据层之间有一个双重接口)。当你把它放在 View-layer (presentation) 上时,你就可以 (hold on!!) 用另一台机器替换 USER 界面,从而自动化 REAL 输入 (!!!)【参考方案5】:

当我们谈论层时,我们通常谈论物理进程(具有不同的内存空间)。

因此,如果应用程序的层部署在不同的进程中,那么这些不同的进程将是不同的层。

例如,在 3 层应用程序中,业务层与大型机(单独的进程)通信并与报告服务(单独的进程)通信,那么该应用程序将是 5 层。

因此,通用名称是 n-tier。

【讨论】:

【参考方案6】:

N 层数据应用程序是分成多个层的数据应用程序。也称为“分布式应用程序”和“多层应用程序”,n 层应用程序将处理分成离散的层,分布在客户端和服务器之间。当您开发访问数据的应用程序时,您应该明确区分构成应用程序的各个层。

等等http://msdn.microsoft.com/en-us/library/bb384398.aspx

【讨论】:

【参考方案7】:

N 层数据应用程序是被分离为 多层。也称为“分布式应用程序”和“多层 应用程序”,n 层应用程序将处理分成离散的 分布在客户端和服务器之间的层。当你 开发访问数据的应用程序,你应该有一个清晰的 构成应用程序的各个层之间的分离。

一个典型的 n 层应用程序包括一个表示层、一个中间层 层和数据层。分离各个层的最简单方法 在 n 层应用程序中是为每一层创建离散项目 您想包含在您的应用程序中。例如, 表示层可能是 Windows 窗体应用程序,而 数据访问逻辑可能是位于中间层的类库。 此外,表示层可能与数据进行通信 通过服务(例如服务)访问中间层中的逻辑。 将应用程序组件分成不同的层会增加 应用程序的可维护性和可扩展性。它通过 能够更容易地采用可应用于 单层,无需重新设计整个解决方案。在 此外,n 层应用程序通常将敏感信息存储在 中间层,它与表示层保持隔离。

取自微软website。

【讨论】:

【参考方案8】:

如果我理解了这个问题,那么在我看来,提问者是真的在问“好的,所以 3 层很好理解,但似乎围绕什么 4 层存在炒作、混淆和不确定性,或者概括地说,N 层架构的意思。那么......被广泛理解和认同的 N 层定义是什么?”

这实际上是一个相当深的问题,为了解释原因,我需要更深入一点。忍受我。

经典的 3 层架构:数据库、“业务逻辑”和表示,是阐明如何遵守关注点分离原则的好方法。也就是说,如果我想改变“业务”想要为客户服务的方式,我不应该查看整个系统来弄清楚如何做到这一点,尤其是决策业务问题不应该分散不顾一切地通过代码。

现在,这种模型已经运行了几十年,它是经典的“客户端-服务器”模型。快进到云产品,其中 Web 浏览器是广泛且物理分布的一组用户的用户界面,通常最终必须添加内容分发服务,这不是经典 3 层架构的一部分(以及需要自行管理)。

这个概念概括了服务、微服务、数据和计算的分布方式等等。某物是否是“层”很大程度上取决于该层是否为该层后面(或下面)的服务提供接口和部署模型。因此,内容分发网络将是一个层,但身份验证服务不会。

现在,带着这个概念去阅读 N 层架构示例的其他描述,你就会开始理解这个问题。其他观点包括基于供应商的方法(例如 nginx)、内容感知负载平衡器、数据隔离和安全服务(例如 IBM Datapower),所有这些可能会或可能不会为给定架构增加价值,部署和用例。

【讨论】:

【参考方案9】:

在构建通常的 MCV(一种 3 层架构)时,可以决定使用双层接口来实现 MCV,这样实际上就可以替换特定层而无需修改甚至一行代码。

我们经常看到这样做的好处,例如在您希望能够使用多个数据库的情况下(在这种情况下,您在控件和数据之间有一个双重接口-层)。

当你把它放在视图层(演示),然后你可以(坚持!!)用另一台机器替换用户界面,从而自动化真实输入(!!!)-因此,您可以运行乏味的可用性测试数千次,而无需任何用户一遍又一遍地点击和重新点击相同的东西。

有些人将这种具有 1 或 2 个双接口的 3 层架构 描述为 4 层5 层 架构,隐含暗示双接口。

其他情况包括(但不限于)您 - 在半复制或完全复制的数据库系统的情况下,实际上可以将其中一个数据库视为“主数据库”,因此您会有一个由主数据库组成的层和另一个由从数据库组成的层。

移动示例

因此,多层 - 或 N 层 - 确实有一些解释,而我肯定会坚持 3 层 + 由薄接口磁盘组成的额外层启用所述层交换,并且在测试方面(特别是在移动设备上使用),您现在可以通过模拟用户点击以控制逻辑无法区分的方式在真实软件上运行用户测试来自真实用户的点击。这在模拟真实用户测试中几乎是最重要的,因为您可以记录来自用户 OTA 的所有输入,然后在进行回归测试时重复使用相同的输入。

【讨论】:

【参考方案10】:

来自https://docs.microsoft.com/en-us/azure/architecture/guide/architecture-styles/n-tier

N 层架构主要将应用轮胎分为逻辑层物理层,它们又分为子部分。

层是一种分离职责和管理依赖关系的方法。每一层都有特定的职责。较高层可以使用较低层中的服务,但反之则不行。

层在物理上是分开的,在不同的机器上运行。一个层可以直接调用另一个层,或者使用异步消息传递(消息队列)。尽管每一层都可能托管在自己的层中,但这不是必需的。多个层可能托管在同一层上。物理上分离各层提高了可扩展性和弹性,但也增加了额外网络通信的延迟。

传统的三层应用程序具有表示层、中间层和数据库层。中间层是可选的。更复杂的应用程序可以有超过三层。上图显示了一个具有两个中间层的应用程序,封装了不同的功能区域。

N 层应用程序可以具有封闭层架构或开放层架构:

In a closed layer architecture, a layer can only call the next layer immediately down.
In an open layer architecture, a layer can call any of the layers below it.

封闭的层架构限制了层之间的依赖关系。但是,如果一层只是将请求传递到下一层,它可能会产生不必要的网络流量。

【讨论】:

【参考方案11】:

Martin Fowler 清楚地展示:

分层是软件设计人员最常用的技术之一 分解一个复杂的软件系统。你在机器架构中看到它, 层从带有操作系统调用的编程语言下降而来 进入设备驱动程序和 CPU 指令集,进入芯片内部的逻辑门。 网络有 FTP 在 TCP 之上分层,它在 IP 之上,它在 以太网顶部。

在考虑层级的系统时,您会想象主要的子系统 在软件中以某种形式排列层蛋糕,其中每一层 位于较低层。在这个方案中,高层使用各种服务 由下层定义,但下层不知道上层。 此外,每一层通常都将其较低的层从上面的层中隐藏起来,所以 第 4 层使用第 3 层的服务,它使用第 2 层的服务,但第 4 层 不知道第 2 层。(并非所有分层架构都像这样不透明,但是 大多数是——或者说大多数是不透明的。)

将系统分解成层有许多重要的好处。

• 您可以在不知道的情况下将单个层理解为一个连贯的整体 很多关于其他层。您可以了解如何构建 FTP 服务 在不了解以太网工作原理的情况下建立在 TCP 之上。

• 您可以用相同的替代实现替换层 基本服务。 FTP 服务无需通过以太网、PPP、 或任何有线电视公司使用的东西。

• 您可以最大限度地减少层之间的依赖关系。如果有线电视公司发生变化 它的物理传输系统,只要他们使 IP 工作,我们不 必须更改我们的 FTP 服务。

• 图层是标准化的好地方。 TCP和IP是标准 因为它们定义了它们的层应该如何操作。

• 一旦您构建了一个层,您就可以将它用于许多更高级别的服务。 因此,FTP、telnet、SSH 和 HTTP 使用 TCP/IP。否则,所有这些 高级协议必须编写自己的低级协议。 来自凯尔·杰弗里·帕萨雷利图书馆

分层是一项重要的技术,但也有缺点。

• 层很好地封装了一些但不是全部的东西。结果你有时 得到级联的变化。分层企业中的经典示例 应用程序正在添加一个需要在 UI 上显示的字段,必须是 在数据库中,因此必须添加到其间的每一层。

• 额外的层会损害性能。在每一层,事情通常需要 从一种表示转换为另一种表示。然而,封装 一个底层函数通常会给你带来更多的效率收益 比补偿。控制事务的层可以被优化和 然后将使一切更快。 但是分层架构中最难的部分是决定拥有哪些层 以及每一层的职责应该是什么。

【讨论】:

【参考方案12】:

N 层应用程序是包含三个以上组件的应用程序。 这些组件是什么?

缓存 异步行为的消息队列 负载平衡器 用于搜索海量数据的搜索服务器 涉及处理海量数据的组件 运行异构技术的组件,通常称为 Web 服务 等

Instagram、Facebook 等所有社交应用,Uber、Airbnb 等大型行业服务,Pokemon Go 等在线大型多人游戏,具有花哨功能的应用都是 n 层应用。

【讨论】:

以上是关于什么是 N 层架构?的主要内容,如果未能解决你的问题,请参考以下文章

MVC 与 n 层架构

n 层架构 - BLL、DAL 和接口。啥是最佳实践?

什么是三层架构?你真的理解分层的意义吗?

在 MVC 和 3 层或 N 层架构中开发网站有啥区别?

3/N层架构“框架+插件”架构地域分布式架构

MVC 和 N 层架构