在现在的软件开发领域,分层架构已经成为一种构建清晰、易维护系统的策略。无论是早期经典的 MVC 三层架构,还是现在在 DDD 指导下的四层架构、洋葱架构、六边形架构,本质上都是一种分层架构。
作为技术人,作为架构师,每当提到架构设计,其实心里总是充满了复杂的思考和责任感。总想着做一个牛逼的架构出来,但是受限于现实中的组织、资源等因素,总是在权衡中取得平衡点。毕竟,一个优秀的架构既要考虑组织架构因素和资源的投入,也要考虑到代码的整洁和维护,还要保证系统的性能和扩展性。
而分层架构就是一种经典的设计思路,他指导架构师把系统分为多个相互独立的层次,每一层都要承担特定的职责。这样做的好处当然是显而易见的:降低了系统的复杂度,提高了代码的可读性和可维护性。每个层次之间通过清晰的接口进行通信,避免了层与层之间的直接依赖,从而减少了耦合度。

在我们软件工程的世界里,架构师就像画家一样,可以用分层架构这支画笔,在代码的画布上画出清晰、高效的软件架构系统,分层架构对于一个技术团队来说,不仅是一种技术时间,更是一种艺术创作,他可以帮助技术人在复杂性和可管理性之间找到平衡。
分层架构的优势在你现在的团队和维护的系统中,看看有没有下面的问题:
很难识别出反映领域逻辑的代码,难以保证与领域模型的一致性应该内聚的逻辑分散在不同地方,应该解耦的逻辑又混在一起,代码难以理解修改业务代码影响技术代码,修改技术代码影响业务代码,维护成本巨大各种硬编码,代码日益混乱,“屎山”越来越严重,质量问题频出如果你的团队和系统中已经出现了这些问题,那“恭喜”你,这样一个难以维护、毫无规范“大泥球”终于“成功”砸在你和你团队身上了。而在现实中,我们用来解决这种“大泥球”的最佳解决方案就是分层架构。
综上所述,分层架构体现了软件架构设计的一个重要的原则:代码中不稳定的部分,应该依赖稳定的部分,表现上就是越是内层就越稳定,越是外层就越容易变化。
分层架构其实是提供了一种清晰的视角,可以帮助架构师和开发者们来理解系统的每个部分是如何协调工作的。主要优势在我看来有以下三点:
模块化:分层架构指导思想下的每一层都应该是独立的模块,可以单独的开发、测试、部署。可维护性:分层架构指导思想下的系统架构,当系统的一部分需要进行更新时,不会影响其他层,或者说不会影响太多其他层的逻辑。可扩展性:分层架构指导思想下的产品系统,在有新的功能需求的时候,是可以作为新的一层或者一个模块轻松地添加到现有架构中的。分层架构的划分接下来我们一起来看看 DDD 设计思想指导下的分层架构是怎么来划分的。
DDD 对代码架构最核心的要求就是把领域层分离独立出来,领域层来封装领域数据和逻辑,让领域层保证与领域模型一致,这样才能让领域层独立演化,一般处于最内层,是整个系统的核心。
领域层的实现一般都是细粒度的,不适合直接暴露给其他层,另外就是比如事务控制这些不属于领域层的横切关注点,是需要在领域层外面再加上这么一 层,我们称之为应用层。应用层一般负责:
接受客户端请求,调用和协调领域层的逻辑来解决问题把领域层的处理结果封装成更简单的粗粒度对象,作为对外 API 的参数,一般定义为 DTO,没有逻辑的数据传输对象,由应用层负责 DTO 和领域对象之间的数据转换负责处理事务、日志、权限等横切关注点然后在应用层外面加上适配层,用适配器来处理输入输出,系统要和外界打交道可以通过不同技术来实现,Restful API、RPC 等,把输入输出技术实现和业务功能分离
再然后就是用适配器来处理数据的持久化,包括数据库、缓存、文件系统、对象存储服务等的访问。使用仓库的方式把具体的持久化技术和应用层以及领域层隔离
最后就是用来存放通用工具和框架相关的,这是对各层代码起到支撑作用的。
这里呢,我们一起思考一个问题,那就是我们每一个项目都要这样分层吗?不这样分层就不是清晰的分层架构了?就不是现在大家都追求的 DDD 了?
答案在文末揭晓哦~
分层架构模型基于上面对划分层次的过程,我们再一起总结下分层架构的模型。当然,现在很多人对分层架构进行描述和区分的时候,往往采取的是以下四种:
表示层:负责呈现用户界面和用户交互业务逻辑层:包含核心的业务规则和决策过程数据访问层:与数据库或者其他数据源交互,负责数据的持久化服务层:协调各层之间的交互不过灸哥今天所讲的分层模型是在 DDD 设计思想指导下的分层模型,我将这样的一个分层架构模型分为以下四层:
层次一:用户接口层
用户接口层负责向用户显示信息和执行用户指令,这里的用户可能是用户、程序、自动化测试和批处理的脚本等。
层次二:应用层应用层比较薄,理论上不包括业务规则和逻辑,主要面向用例和流程相关的操作。在 DDD 指导下的分层架构中,应用层在领域层之上,领域层中包含多个聚合,应用层承担了协调多个聚合的服务和领域对象完成服务的编排和组合,协调完成业务操作。
应用层也是微服务架构中各个微服务之间交互的通道,可以调用其它微服务的应用服务,完成微服务之间的服务组合和编排。
提醒:尽量千万不要把应该在领域层的业务逻辑放在应用层中,长期下去,应用层和领域层边界模糊,四层架构演化成三层架构了,业务逻辑变得混乱。
应用层的服务称之为应用服务,负责服务的组合、编排和转发,负责处理业务用例的执行顺序以及结果的拼装,以粗粒度的服务通过 API 网关向前端发布。同时还可以进行安全认证、权限校验、事务控制、发送或订阅事件等。
层次三:领域层领域层是在 DDD 设计思想指导下的一个“新”的层次,他的作用是实现企业核心业务逻辑,通过各种校验手段保证业务的正确性。领域层主要体现领域模型的业务能力,它用来表达业务概念、业务状态和业务规则。包含聚合根、实体、值对象、领域服务等领域模型中的领域对象。
领域模型的业务逻辑主要是由实体和领域服务来实现的,其中实体会采用充血模型来实现所有与之相关的业务功能。
实体和领域服务在实现业务逻辑上不是同级的,当领域中的某些功能,单一实体(或者值对象)不能实现时,领域服务就会出马,它可以组合聚合内的多个实体(或者值对象),实现复杂的业务逻辑。
层次四:基础层基础层是贯穿所有层的,它的作用就是为其它各层提供通用的技术和基础服务,包括第三方工具、驱动、消息中间件、网关、文件、缓存以及数据库等。
基础层包含基础服务,它采用依赖倒置设计,封装基础资源服务,实现应用层、领域层与基础层的解耦,降低外部资源变化对应用的影响。
在 DDD 设计思想指导下的分层架构有一个非常重要的原则,大家一定要切记,那就是:每层只能与位于其下方的层发生耦合。
洋葱架构洋葱架构也称之为整洁架构,在洋葱架构中,同心圆代表应用软件的不同部分,从里到外依次是领域模型、领域服务、应用服务和最外围的容易变化的内容,比如用户界面和基础设施。
最主要的原则是依赖原则,它定义了各层的依赖关系,越往里依赖越低,代码级别越高,越是核心能力。外圆代码依赖只能指向内圆,内圆不需要知道外圆的任何情况。
各层的职能描述如下:
领域模型实现领域内核心业务逻辑,它封装了企业级的业务规则。领域服务实现涉及多个实体的复杂业务逻辑。应用服务实现与用户操作相关的服务组合与编排,它包含了应用特有的业务流程规则,封装和实现了系统所有用例。最外层主要提供适配的能力,适配能力分为主动适配和被动适配。主动适配主要实现外部用户、网页、批处理和自动化测试等对内层业务逻辑访问适配。被动适配主要是实现核心业务逻辑对基础资源访问的适配,比如数据库、缓存、文件系统和消息中间件等。红圈内的领域模型、领域服务和应用服务一起组成软件核心业务能力。六边形架构六边形架构又称之为端口适配器架构。核心理念是应用通过端口与外部进行交互。
红圈内的核心业务逻辑(应用程序和领域模型)与外部资源(包括 APP、Web 应用以及数据库资源等)完全隔离,仅通过适配器进行交互。它解决了业务逻辑与用户界面的代码交错问题,很好地实现了前后端分离。六边形架构各层的依赖关系与整洁架构一样,都是由外向内依赖。
分层架构的精髓
无论是四层、洋葱/整洁还是六边形的架构风格,其实本质上都是运用了分层架构的设计思想,我们一起看看这三种架构模式的共性是什么?
我对这三种架构模式做了一个提炼和总结,也就是上图中用红色框标注的部分,这个红色线框的作用是将核心业务逻辑与外部应用、基础资源进行隔离,主要实现核心业务逻辑,但核心业务逻辑有属于领域模型的能力,有属于面向用户的用例和流程编排能力,按着这种功能的差异,划分出了应用层和领域层,承担不同的业务逻辑。
领域层实现面向领域模型,实现领域模型的核心业务逻辑,属于原子模型,它需要保持领域模型和业务逻辑的稳定,对外提供稳定的细粒度的领域服务,所以它处于架构的核心位置。
应用层实现面向用户操作相关的用例和流程,对外提供粗粒度的 API 服务。它就像一个齿轮一样进行前台应用和领域层的适配,接收前台需求,随时做出响应和调整,尽量避免将前台需求传导到领域层。应用层作为配速齿轮则位于前台应用和领域层之间。
架构模型通过分层的方式来控制需求变化从外到里对系统的影响,从外向里受需求影响逐步减小。面向用户的前端可以快速响应外部需求进行调整和发布,灵活多变,应用层通过服务组合和编排来实现业务流程的快速适配上线,减少传导到领域层的需求,使领域层保持长期稳定。
传统的三层架构如何演进到四层架构传统企业内大多是单体三层架构,三层架构解决了程序内代码间调用复杂、代码职责不清的问题,但它是逻辑分层概念,物理上还是中心化的集中式架构,不适合分布式微服务架构。
其实两者都是分层架构,演进过程只需要把要素重新归类,重新划分层次,确定层与层之间的交互规则和职责边界。
如上所述,采用分层架构的最大优势在于其清晰的层次划分,使得系统各个部分职责明确,彼此独立。这样的设计不仅有助于代码的重用和维护,还能提高开发团队的协作效率。每个团队可以专注于自己负责的层次,不同层次的修改不会相互影响,从而减少了冲突和错误。
此外,分层架构还为系统的扩展性提供了良好的支持。当业务需求发生变化时,只需要对相关层次进行调整,而无需大规模地重构整个系统。这一点在快速迭代和敏捷开发中尤为重要。
但是分层架构并不是万能的,在实际应用中,我们是需要根据具体情况来进行调整的,比如,在处理高性能需求的系统时,层次过多可能导致性能瓶颈,此时我们需要在保持清晰架构的前提下,进行适当的优化。
不过总的来说,分层架构是一种行之有效的设计策略,能够帮助我们构建清晰、易维护的软件系统。在日常的开发实践中,通过不断优化和调整,我们可以充分发挥其优势,为项目的成功打下坚实的基础。
答案揭晓时刻本文所讲的分层架构相关的所有内容,其实是为了让大家理解分层架构背后的原理,现实中是需要你针对自己项目中的特点、痛点以及其他现实因素来进行权衡的,形成适合你们团队和项目的架构规范。
事实上,在实际项目中,根据具体的情况,有些层次是可以合并的,也有些层次其实还可以分的更加细一点。