一个合适的应用架构不仅能促使项目朝着好的方向发展,易于维护,也能指导团队成员有效协作。

DDD是站在领域的角度来驱动应用架构的落地,接下来将介绍一种落地方案。

架构分层

首先在架构层次方面,在遵循DDD的分层架构模式的同时,结合六边形架构的形态,形成一种新的分层架构模式。如下所示:

每个层次的职责如下:

  • 适配器层(adapter),是系统流量的入口,将请求分发给应用层去处理具体应用逻辑。该层涵盖业务接口请求、批处理、消息等。
  • 门面层(facade),作为系统的门面,用于表达系统对外暴露的能力。
  • 应用层(application),是系统的应用逻辑编排层,用于做跨系统或者跨聚合的业务编排,不表达核心控制能力。
  • 领域层(domain),作为领域驱动架构的内核,其承载的是系统的核心模型、规则与服务,是整个系统的大脑所在。
  • 基础设施层(infrastructure),是系统的基座,其支撑着领域层;该层的定位主要是系统基础能力(缓存、存储等)、下游支撑系统的集成、领域能力的防腐等。

架构依赖

在工程应该架构上,各组件模块之间的依赖交互如下:

工程结构

在形成架构的可落地模式后,工程落地上也是很重要的,其将会影响项目的维护性以及编码落地阶段的执行策略。下面来看一种可落地的工程结构形态:

.|-- app| |-- adapter| |-- application| |-- domain| |-- facade| `-- infrastructure| |-- acl| |-- dal| |-- integration|-- bootstrap|-- conf`-- test

每个目录的含义如下:

  • app: 工程应用存放代码的目录,其中子目录是前面架构分层中所说的不同模块
  • bootstrap:应用的启动器,以及应用除环境之外的配置信息
  • conf:环境相关的配置信息
  • test:工程相关的测试代码

在工程结构上,将基础设施层按职责进行了拆分:

  • dal: 数据库交互模块
  • integration:系统集成模块,比如与下游系统的集成,其他基础能力的集成
  • acl:系统防腐层,领域与基础设置之间的防腐隔离

若想查看工程结构更详细信息,可点击 ddla架构工程规范 。

架构使用

使用如下maven命令,替换groupId、artifactId、version、package等参数为你期望的值即可,架构脚手架的版本(ddla-archetype.version)可直接使用groupId(ddla-archetype)在maven仓库搜索。

mvn archetype:generate \-DgroupId=com.lazycece.ddlademo \-DartifactId=ddlademo \-Dversion=1.0.0-SNAPSHOT \-Dpackage=com.lazycece.ddlademo \-DarchetypeArtifactId=ddla-archetype \-DarchetypeGroupId=com.lazycece.ddla \-DarchetypeVersion=${ddla-archetype.version}

开源地址

https://github.com/lazycece/ddla