微服务架构模型有很多种,例如洋葱架构、CQRS和六边形架构等。其核心理念都是为了设计出“高内聚,低耦合”的微服务。而DDD分层架构的出现,使微服务的架构边界变得越来越清晰。
DDD分层架构包含四层,从上到下依次是:用户接口层、应用层、领域层和基础层。
DDD分层架构
1. 用户接口层
微服务应用面向不同前端应用时,同样一段业务逻辑,可能由于渠道不同,而在前端展示的页面要素,因此要求后端微服务返回的数据结果会不同。为了避免暴露微服务的核心业务逻辑,防止数据外泄,不能将后端对象的所有属性数据,不加区分地暴露给所有前端应用;更不能仅仅因为前端应用不同的数据展示要求,而后端定制开发出多个不同的应用服务或领域服务,面向前端应用提供不同的服务适配。保证应用层和领域层核心领域逻辑的稳定。
Facade服务:封装应用服务,适配不同前端应用的集成技术体系,提供不同类型的服务接口适配。数据组装器Assembler:根据不同前端应用的数据需求,完成前端DTO和后端DO对象的组装和转换操作。
2. 应用层
应用层连接用户接口层和领域层,不应该实现领域模型的核心领域逻辑。主要职能:协调领域层多个聚合完成服务的组合和编排。
应用服务主要负责服务组合、编排和转发,处理业务用例的执行顺序以及结果的拼装。在应用服务中还可以进行安全认证、权限校验、事务控制、领域事件发布或订阅等。
3. 领域层
领域层是领域模型的核心,主要实现领域模型的核心业务逻辑。领域模型的业务逻辑主要由实体和领域服务来实现。其中实体会采用充血模型来实现业务功能,如单一实体(或值对象)不能实现时,就交由领域服务进行组合和协调聚合内多个实体(或值对象),实现复杂的业务逻辑。
4. 基础层
基础层贯穿DDD所有层。其职能:提供通用的技术和基础服务,包括第三方工具、驱动、消息中间件、网关、文件、缓存以及数据库等。
DDD分层架构的重要原则:每层只能与位于其下方的层发生耦合。
三层架构和DDD分层架构对比
DDD分层架构的优势
层间松耦合,成功降低了层与层之间的依赖。可以专注于本层的设计和开发,不担心会影响到其他层。
是程序的结构变得更加清晰,升级和维护变得更加容易,修改工作量小且范围可控。只要本层服务接口不变,其他层皆不用修改,即是结构发生变化,也只影响相邻的上层。
三层架构与DDD四层架构的关系
三层架构与DDD四层架构的比较和关系
1. 用户接口层改变用户接口层,引入DTO和Facade接口,给前端应用提供灵活的数据和接口适配能力。
2. 业务逻辑层的改变DDD分层架构对三层架构的业务逻辑层进行了更清晰的划分,改善了三层架构核心业务逻辑混乱、代码改动相互影响大的问题。DDD分层架构将三层架构业务逻辑层的业务逻辑拆分到应用层和领域层,应用服务实现服务的组合和编排,领域服务完成核心领域逻辑。
3. 数据访问层的改变三层架构数据访问层采用DAO方式。而DDD架构采用仓储模式,领域层可以用过仓储接口访问基础资源的实现逻辑。
DDD、微服务、中台的关系
DDD是一种架构设计方法论,通过业务边界划分将复杂业务领域简单化,划分出清晰的业务领域和应用边界,从而很容易地实现微服务的架构演进。DDD将子域划分为核心子域、通用子域和支撑子域,目的是识别企业重点领域,有区别地确定战略资源的投入,投入重点自然是核心子域。我们看下DDD视角与中台视角的对应关系,如下图所示:
DDD视角和中台视角的领域分解过程
中台设计偏向于业务架构,形成中台的过程也是业务领域不断细分和能力沉淀的过程,在这个过程中,我们会对同类通用业务能力进行聚合和重构,再根据限界上下文和业务内聚的原则建立领域模型。DDD战略设计最擅长的就是领域建模。在完成中台的领域建模后,领域模型就可以作为微服务设计的输入。限界上下文和领域模型可以作为微服务拆分和设计的边界和依据。如下图所示:
DDD战略设计和战术设计
因此,业务中台和微服务是DDD实战的最佳场景。
DDD、中台和微服务的铁三角关系