软件分层架构实施指南:构建可维护系统

一、分层概念

分层是一种常见的根据系统中的角色/职责拆分和组织代码单元的常规实践。注:本文说的不单指后端架构,而是整个软件的分层架构,包含前端、后端、数据库。


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

  • 依赖它之下的层;
  • 和它之上的层无关,对使用(依赖)它的层次无感知。

在分层架构中,分层可以访问它之下的任何分层。

二、分层历史

2.1 单层架构--20 世纪 60 年代和 70 年代

当时的应用程序和今天的应用程序截然不同。那时还没有 GUI。所有的应用程序要通过命令行使用,显示在一个哑终端里,它们实际上是单层的应用程序。如下图所示

软件分层架构 软件分层架构怎么做_用户界面

2.2 三层架构--20 世纪 80 年代和 90 年代

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


这时它们多半分成三层:

  • 用户界面(展现):用户界面就是网页、命令行或者原生桌面应用;
  • 例如:作为(富)客户端的 Windows 应用,普通用户在桌面电脑上使用,和服务器器通信才能完成工作。客户端负责应用的流程和用户输入的校验;
  • 业务逻辑(领域):应用之所以存在的逻辑;
  • 例如:应用服务器,包含业务逻辑并从原生客户端接收请求,采取行动并将数据保存到数据存储;
  • 数据源:数据的持久化机制(数据库),或者是和其它应用之间的通信。
  • 例如:数据库服务器,应用服务器用它来完成数据持久化。

软件分层架构 软件分层架构怎么做_用户界面_02

这实际上是一种 两层 应用,客户端是一个用为应用界面的富客户端应用程序,而业务逻辑和数据源放在服务器。



90年代后期,发展出真三层架构:

  • 原生浏览器应用程序:渲染和运行用户界面,向服务器应用发送请求;
  • 应用服务器:包括了展现层、应用层、领域层和持久化层;
  • 数据库服务器:应用服务器用它来完成数据的持久化。

软件分层架构 软件分层架构怎么做_业务逻辑_03

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

说实话这种架构,在国内很少用到。国内到2010年,主流都还在玩MVC。

2.3 多层架构--2003年之后DDD领域驱动设计

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

软件分层架构 软件分层架构怎么做_客户端_04


  • 用户界面
    负责绘制用户和应用交互的界面,并将用户输入转换成应用的命令。值得注意的是,“用户”可以是人类也可以是其它应用。它和 Ivar Jacobson 的 EBI 架构(后面其它文章会介绍更多细节)中的边界对象不谋而合;


  • 应用层
    指挥领域对象完成用户要求的任务。它不包括业务逻辑。它和 Ivar Jacobson 的 EBI 架构中的交互器对象对应,唯一不同的是 Jacobson 的交互器可以是任意和界面或实体无关的对象;


  • 领域层
    这一层包含了所有的业务逻辑、实体、事件或者其它任何包含业务逻辑的对象类型。显然它和 EBI 中的实体对象类型相对应。这是系统的心脏;


  • 基础设施
    支撑上面所有层次的技术能力,如持久化机制和消息机制。


很奇怪的是,03年风靡国外的DDD,竟然在21年才开始风靡。炒了一锅冷菜。DDD理论很好,但落地是有一定难度的,具体落地可参考博客:DDD领域驱动设计落地实践(十分钟看完,半小时落地)



2.4 反模式:千层面模式

当我们过分严格遵守分层架构时,容易出现“反模式”。过度的抽象并不利于使用。记住:架构是用来用的,如果成了累赘,不要这种架构也罢

软件分层架构 软件分层架构怎么做_软件分层架构_05

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


  • 热衷于创建完美的系统导致项目过度抽象
  • 更新也会波及应用的方方面面,牵一发动全身,增强依赖性,提升了变动的风险
  • 层次太多,增加了整个系统的复杂性
  • 物理层次太多,不但增加了整个系统的复杂性,还降低了系统的性能
  • 按照UI界面切割,垂直分层来组织我们的单体破坏了领域概念的模块化和封装

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空