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