架构整洁之道软件架构架构师

6.分层架构(译)

2018-09-21  本文已影响47人  qinyu

原文:https://herbertograca.com/2017/08/03/layered-architecture/

这篇文章是软件架构编年史()的一部分,这部编年史由一系列关于软件架构的文章()组成。在这一系列文章中,我将写下我对软件架构的学习和思考,以及我是如何运用这些知识的。如果你阅读了这个系列中之前的文章,本篇文章的的内容将更有意义。

分层是一种常见的根据系统中的角色/职责拆分和组织代码单元的常规实践。

在一个面向对象的程序里,UI、数据库和其它支撑代码会被写到业务对象里。额外的业务逻辑也会被嵌到 UI 控件和数据库脚本里。这是由于在段期内完成够用的代码是更简单的选择。

当领域相关的代码扩散到这样大规模的其它代码中,要发现和理解这些代码会相当困难。表面上对 UI 的修改实际上也会改变业务逻辑。要修改业务规则就得小心翼翼地追踪 UI 代码、数据库代码,或者其它的编程元素。实现内聚的、模型驱动的对象变得不切实际。自动化测试也变得尴尬。如果每个活动都要卷入所有的技术和逻辑,程序必须非常简单,要不然就完全无法理解。

——Eric Evans 2014, Domain-Driven Design Reference

分层意味着什么

** 在一个分层系统中,每一层:

在分层架构中,分层的使用可以严格地限制:分层只知道直接的下层,或者可以款松一些:分层可以访问它之下的任何分层。Martin Fowler 和我自己的经验都是第二种方式实际中会更好,因为它避免了在中间分层创建代码方法(或者完整的代理类),也避免了退化成千层面的反模式(下文会详细探讨)。

有时分层会这样安排,领域层将数据源完全隐藏不让展现层看到。但是,更多的时候展现层会直接访问数据存储。这不那么纯粹,但实际却工作得更好。——Fowler 2002, Patterns of Enterprise Application Architecture

它的优势有

它的劣势在于:

20 世纪 60 年代和 70 年代

尽管上世纪 50 年代软件开发就开始了,它真正发展成我们今天所见的这样是在 60 年代和 70 年代,随着构建可以被发行、部署并可以被除了开发者自己之外其它人使用的应用的活动发展起来的。

然而,当时的应用程序和今天的应用程序截然不同。那时还没有 GUI(大概 80 年代末 90 年代初才出现),所有的应用程序要通过命令行使用,显示在一个哑终端里,它只是将用户的输入传输给应用程序,应用程序很可能就在同一台电脑中被使用。

应用程序此时还十分简单,还不需要分层,它们被部署到一台电脑之中被使用。它们实际上是单层的应用程序,尽管有时哑客户端还是远程的。尽管这些应用程序非常简单,但它们无法伸缩,例如,如果我们需要升级软件的新版本,我们要在每台安装了该软件的电脑上升级。

20 世纪 80 年代和 90 年代的分层

在 20 世纪 80 年代,企业应用出现了,在公司里有多个用户开始使用桌面电脑通过网络访问应用。

这时它们多半分成三层:

随着使用上下文的变迁,分层实践开始得到应用,尽管它真正得到大范围的实践是在 C/S 系统崛起的 20 世纪 90 年代。这实际上是一种 两层 应用,客户端是一个作为应用界面使用的富客户端应用程序,而业务逻辑和数据源放在服务器。

这种架构模式解决了伸缩性问题,因为很多用户可以独立地使用应用,只需要另外一台安装了客户端应用程序的桌面电脑就行。然而,如果我们有数百或者数十个客户端而我们想用更新应用程序的话,操作会特别复杂,因为我们要一个一个地更新客户端。

20 世纪 90 年代中期之后的分层

大约在 1995 年和 2005 年之间,随着普遍迁移到云的趋势,应用用户的增长,
,应用复杂性和基础设施复杂性的增加,我们终于看到了分层方案的变化。新的分层的典型实现如下:

这就是三层架构模式,也叫 N 层架构。它是可伸缩的解决方案,尽管用户界面是在客户端浏览器中渲染和运行,但由于用户界面存放于服务器上并在服务器上编译,它“解决了客户端的更新问题”。

新世纪之后的分层

2003 年, Eric Evans 出版了他的标志性著作 Domain-Driven Design: Tackling Complexity in the Heart of Software。在书中提出的许多关键概念之中,也有软件系统分层的愿景:

反模式:千层面架构

千层面架构常常说的就是分层架构的反模式。以下这些情况发会出现:

总结

分层架构是另一种根据代码在应用中的功能角色对代码单元进行划分的方式,它带了关注点的分离、封装性和解耦。

然而,和生活中的很多事情一样,过犹不及!所以,最重要的一条经验是:只使用必要的层次和物理层次,够用就行!我们千万不要得意忘形地追逐架构的圣杯,它根本就不存在。存在的只是需求,和最可能恰好符合它的架构。顺便说一句,这也是精益所提倡的。

此外,还有一点值得注意,上/下这种纵向的分层方式已经过时了。现代的软件开发中我们不应该使用这种方式了,应用的层次有新的更好的思考方式。我会在接下的文章中进行探讨。

引用来源

2002 – Martin Fowler – Patterns of Enterprise Application Architecture
2003 – Eric Evans – Domain-Driven Design: Tackling Complexity in the Heart of Software
2011 – Chris Ostrowski – Understanding Oracle SOA – Part 1 – Architecture

上一篇下一篇

猜你喜欢

热点阅读