什么是N层架构?

199

最近我看到了很多招聘 IT 开发者的工作职位,其中有一句话写得差不多是这样的:“必须具备 N 层架构经验”或者“必须能够开发 N 层应用程序”。

这让我想问,什么是 N 层架构?如何获得相关经验?


2
有趣的是,这篇帖子也在问什么是N-Tier架构,但答案完全不同。https://dev59.com/bVrUa4cB1Zd3GeqPn9sb。似乎软件和硬件都有N-Tier架构。 - Noremac
14个回答

251

维基百科:

多层次架构(多层架构,英语:n-tier architecture)是应用程序架构的一种形式,将展示、应用处理和数据管理作为逻辑上不同的进程。例如,使用中间件来服务于用户和数据库之间的数据请求的应用程序采用了多层次架构。最广泛的“多层架构”应用通常指三层架构。

人们对于“层”的定义存在争议,但在我看来它至少需要跨越进程边界,否则被称为“层”。但是,它不需要物理上位于不同的计算机上。虽然我不建议这样做,但您可以在同一台计算机上托管逻辑层和数据库。

alt text
(来源: wikimedia.org)

编辑:一个含义是展示层和逻辑层(有时称为业务逻辑层)需要跨越机器边界“通过电线”进行通信,有时还要在不可靠、慢、不安全的网络上通信。这与简单的桌面应用程序或 Web 应用程序非常不同,因为数据存储在文件中或者您可以直接访问数据库。

在n-tier编程中,您需要将数据打包成一种可传输的形式,称为“数据集”,并将它们通过网络传输。.NET的DataSet类或Web服务协议,例如SOAP,都是尝试通过网络传输对象的方式之一。


6
"3层"和"N层"有区别吗? - chakrit
7
这取决于你如何计算“层”(逻辑层、物理层等),但编写应用程序可能涉及多达3个以上的过程。例如用户界面(UI)、UI平台(如Eclipse RCP)、Web服务、业务逻辑层(BLL)、数据访问层(DAL)、数据库、身份验证服务、报告服务、分析服务等等。 - Eugene Yokota
6
在我年轻的时候,当人们说两个层级(客户端-服务器)以上的架构时,通常会自动指代n层架构。 - Eduardo Molteni
1
据@EugeneYokota所说,层级(tiers) 代表架构中的物理部分(可以进一步分区,例如在群集中),而 层(layers) 则指应用程序组件的逻辑分组 - Eliran Malka
我被告知有一些看起来非常相似的东西,但层次结构是表示层 - 服务层 - 集成/数据层。你知道这些是与上面显示的架构相同的不同词汇还是不同的东西吗?就我所知,它们似乎是相同的,但我想确保一下。 - KayleighArianna
@EugeneYokota,您在这个主题[tag:n-tier]中获得了高赞的答案。您能否花一分钟将其他标签(n-tier-architecture和multi-tier)标记为n-tier同义词 - naXa stands with Ukraine

20

它基于如何将表示层与核心业务逻辑和数据访问分离 (维基百科)

  • 3层架构 意味着有 表示层 + 组件层 + 数据访问层。
  • N层架构是指在这些层之外添加额外的层,通常是为了增加可组合性、可配置性或与其他系统的互操作性。

12
如果其中一个层级是由远程方托管的,比如支付处理方,那么该层级可能并不那么“不必要”。 - Zak
1
嗯。'层'和'服务'之间有很大的区别。N-Tier通常用于表示对于给定的层,任何位于其上方的内容必须通过它来访问较低级别的服务。如果它们是并行的,则我会称它们为服务而不是层。 - Dak
在构建通常的MCV(三层架构)时,可以决定使用双层接口实现MCV,这样就可以替换特定层而不必修改任何一行代码。我们经常看到这种好处,例如在想要使用多个数据库的情况下(在这种情况下,在控制和数据层之间有双重接口)。当您将其放在View层(表示层)上时,您可以(等等!!)用另一台机器替换用户界面,从而自动化真实输入(!!!) - David Svarrer

17

这是一个流行词汇,指的是类似于常规Web架构中的东西,例如Javascript - ASP.Net - 中间件 - 数据库层。每个部分都是一个“层”。


4
如果我理解问题的话,那么问题的提问者似乎真正在问:“好的,3层结构已经被很好地理解了,但是似乎对于4层,或者更广泛地说,N层架构还存在炒作、混淆和不确定性。那么...什么是被广泛理解和认可的N层定义呢?"
这实际上是一个相当深入的问题,为了解释原因,我需要深入一些。请耐心等待。
经典的三层架构:数据库、“业务逻辑”和表示层,是澄清如何遵守关注点分离原则的好方法。也就是说,如果我想改变“业务”如何为客户提供服务,我不应该必须浏览整个系统才能找出如何做到这一点,尤其是业务问题的决策不应该随意散布在代码中。
现在,这个模型在数十年来一直表现良好,它是经典的‘客户端-服务器’模型。快进到云服务提供商,其中Web浏览器是广泛分布的用户的用户界面,人们通常会不得不添加内容分发服务,这不是经典的三层架构的一部分(并且需要自己管理)。
当涉及到服务、微服务、数据和计算的分布等问题时,这个概念是可以推广的。某个东西是否是“层”很大程度上取决于该层是否提供了一个接口和部署模型,以便服务在该层的后面(或下面)运行。因此,内容分发网络将成为一层,但身份验证服务将不会成为一层。
现在,阅读其他描述N层架构的例子时,请记住这个概念,然后您将开始理解问题。其他角度包括基于供应商的方法(例如NGINX),内容感知负载平衡器、数据隔离和安全服务(例如IBM Datapower),所有这些都可能或可能不会为给定的架构、部署和使用案例增加价值。

4
N层数据应用是将数据应用程序分为多个层次的应用程序。也称为“分布式应用程序”和“多层应用程序”,N层应用程序将处理过程分离成离散的层次,这些层次在客户端和服务器之间分布。当您开发访问数据的应用程序时,应该清楚地分离组成应用程序的各个层次。 典型的N层应用程序包括表示层、中间层和数据层。将N层应用程序中的各个层次分离的最简单方法是为您想要包含在应用程序中的每个层次创建离散的项目。例如,表示层可以是Windows窗体应用程序,而数据访问逻辑可能是位于中间层的类库。此外,表示层可以通过诸如服务等服务与中间层的数据访问逻辑通信。将应用程序组件分离到单独的层次中可以增加应用程序的可维护性和可扩展性。它通过使新技术更容易应用于单个层次而无需重新设计整个解决方案来实现这一点。此外,N层应用程序通常将敏感信息存储在中间层中,这保持了与表示层的隔离。

摘自微软网站


3
N层数据应用程序是将数据应用程序分成多个层次的应用程序。也称为“分布式应用程序”和“多层应用程序”,N层应用程序将处理过程分为离散的层次,这些层次分布在客户端和服务器之间。当您开发访问数据的应用程序时,应该清楚地分离组成应用程序的各个层次。
详见http://msdn.microsoft.com/en-us/library/bb384398.aspx

3
在构建常规的MCV(三层架构)时,可以决定使用双层接口来实现MCV,这样就可以替换特定层,而无需修改任何一行代码。通常情况下,我们会看到这种方法的好处,例如在想要使用多个数据库的情况下(在这种情况下,控制层和数据层之间有双重接口)。如果将其放在视图层上(演示),则可以使用另一台计算机替换用户界面,从而自动进行真正的输入,并且可以进行数千次繁琐的可用性测试,而无需用户反复点击相同的内容。
有些人将具有1或2个双重接口的3层架构描述为4层或5层架构,这暗示了双重接口。
其他情况包括(但不限于)在半或完全复制的数据库系统中,你实际上可以将其中一个数据库视为“主”数据库,因此你将有一个由主数据库组成的层,以及另一个由从数据库组成的层。
因此,多层或N层确实有几种解释,而我肯定会坚持3层+额外的薄接口盘层,以实现所述的层交换;而在测试方面(特别是在移动设备上使用),你现在可以运行对真实软件的用户测试,通过模拟用户的点击方式,控制逻辑无法区分真正的用户点击。这在模拟真实用户测试方面几乎是至关重要的,因为你可以记录来自用户OTA的所有输入,然后在进行回归测试时重新使用相同的输入。

3

据我了解,N-Tier通过使用单独的物理机器将业务逻辑、客户端访问和数据分离开来。其理论是其中之一可以独立于其他部分进行更新。


2

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

因此,如果应用程序的层部署在不同的进程中,则这些不同的进程将成为不同的层。

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

因此,通用名称为n层。


2
来自https://learn.microsoft.com/en-us/azure/architecture/guide/architecture-styles/n-tier
N层架构将应用程序分为逻辑层和物理层,并将它们划分为子部分。
层是一种分离职责和管理依赖关系的方式。每个层都有特定的职责。较高的层可以使用较低的层中的服务,但反之则不行。
物理层被物理上分隔在不同的机器上。一个层可以直接调用另一个层,或者使用异步消息传递(消息队列)。虽然每个层可以托管在自己的层上,但这并非必需的。几个层可以托管在同一个层上。物理上分隔层提高了可伸缩性和弹性,但也增加了由于额外的网络通讯而带来的延迟。 enter image description here 传统的三层应用程序包括表示层、中间层和数据库层,其中中间层是可选的。更复杂的应用程序可以有多个层次。上面的图表显示了一个具有两个中间层的应用程序,分别封装不同的功能区域。
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.

一种封闭层结构限制了层之间的依赖关系。然而,如果一个层仅仅是将请求传递给下一个层,那么它可能会产生不必要的网络流量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接