DDD基本架构!

DDD分层架构

DDD 的分层架构最早是传统的四层架构。

后来四层架构有了进一步的优化,实现了各层对基础层的解耦。

再后来领域层和应用层之间增加了上下文环境(Context)层,五层架构(DCI)就此形成了。

11

在最早的传统四层架构中,基础层是被其它层依赖的,它位于最核心的位置。

那按照分层架构的思想,它应该就是核心,但实际上领域层才是软件的核心,所以这种依赖是有问题的。

后来采用了依赖倒置(Dependency Inversion Principle,DIP)的设计,优化了传统的四层架构,实现了各层对基础层的解耦。

11

用户接口层:

用户接口层负责向用户显示信息和解释用户指令。

应用层:

它可以协调多个聚合的服务和领域对象完成服务编排和组合,协作完成业务操作。

应用层也是微服务之间交互的通道,它可以调用其它微服务的应用服务,完成微服务之间的服务组合和编排。

  • 应用服务还可以进行安全认证、权限校验、事务控制、发送或订阅领域事件等。

领域层:

领域层主要体现领域模型的业务能力,它用来表达业务概念、业务状态和业务规则。

领域层包含聚合根、实体、值对象、领域服务等领域模型中的领域对象。

基础层:

它的作用就是为其它各层提供通用的技术和基础服务,包括第三方工具、驱动、消息中间件、网关、文件、缓存以及数据库等。

  • 比较常见的功能是提供数据库持久化。

DDD分层架构最重要的原则是什么?

每层只能与位于其下方的层发生耦合。

架构根据耦合的紧密程度分为两种:

  • 严格分层架构和松散分层架构。

优化后的 DDD 分层架构模型就属于严格分层架构,任何层只能对位于其直接下方的层产生依赖。

而传统的 DDD 分层架构则属于松散分层架构,它允许某层与其任意下方的层发生依赖。

在严格分层架构中:

  • 领域服务只能被应用服务调用,而应用服务只能被用户接口层调用,服务是逐层对外封装或组合的,依赖关系清晰。

在松散分层架构中:

  • 领域服务可以同时被应用层或用户接口层调用,服务的依赖关系比较复杂且难管理,甚至容易使核心业务逻辑外泄。

微服务架构模型

整洁架构(洋葱架构):

在整洁架构里,同心圆代表应用软件的不同部分。

从里到外依次是领域模型、领域服务、应用服务和最外围的容易变化的内容,比如用户界面和基础设施。

整洁架构最主要的原则是依赖原则,它定义了各层的依赖关系,越往里依赖越低,代码级别越高,越是核心能力。

外圆代码依赖只能指向内圆,内圆不需要知道外圆的任何情况。

在洋葱架构中,各层的职能是这样划分的:

  • 领域模型实现领域内核心业务逻辑,它封装了企业级的业务规则。
  • 领域模型的主体是实体,一个实体可以是一个带方法的对象,也可以是一个数据结构和方法集合。
  • 领域服务实现涉及多个实体的复杂业务逻辑。
  • 应用服务实现与用户操作相关的服务组合与编排,它包含了应用特有的业务流程规则,封装和实现了系统所有用例。
  • 最外层主要提供适配的能力,适配能力分为主动适配和被动适配。
    • 主动适配主要实现外部用户、网页、批处理和自动化测试等对内层业务逻辑访问适配。
    • 被动适配主要是实现核心业务逻辑对基础资源访问的适配,比如数据库、缓存、文件系统和消息中间件等。
  • 红圈内的领域模型、领域服务和应用服务一起组成软件核心业务能力。

11

六边形架构:

六边形架构的核心理念是:应用是通过端口与外部进行交互的。

六边形架构中,红圈内的核心业务逻辑(应用程序和领域模型)与外部资源(包括 APP、Web 应用以及数据库资源等)完全隔离。

  • 仅通过适配器进行交互。

它解决了业务逻辑与用户界面的代码交错问题,很好地实现了前后端分离。

六边形架构各层的依赖关系与整洁架构一样,都是由外向内依赖。

六边形架构将系统分为内六边形和外六边形两层,这两层的职能划分如下:

  • 红圈内的六边形实现应用的核心业务逻辑。
  • 外六边形完成外部应用、驱动和基础资源等的交互和访问。
    • 对前端应用以 API 主动适配的方式提供服务,对基础资源以依赖倒置被动适配的方式实现资源访问。

六边形架构的一个端口可能对应多个外部系统,不同的外部系统也可能会使用不同的适配器,由适配器负责协议转换。

  • 这就使得应用程序能够以一致的方式被用户、程序、自动化测试和批处理脚本使用。

11

项目级微服务

项目级微服务的内部遵循分层架构模型就可以了。

领域模型的核心逻辑在领域层实现,服务的组合和编排在应用层实现,通过 API 网关为前台应用提供服务,实现前后端分离。

但项目级的微服务可能会调用其它微服务,比如某个项目级微服务 B 调用认证微服务 A,完成登录和权限认证。

通常项目级微服务之间的集成,发生在微服务的应用层,由应用服务调用其它微服务发布在 API 网关上的应用服务。

  • 图中微服务 B 中红色框内的应用服务 B,它除了可以组合和编排自己的领域服务外,还可以组合和编排外部微服务的应用服务。

  • 它只要将编排后的服务发布到 API 网关供前端调用,这样前端就可以直接访问自己的微服务了。

11