模块化单体架构设计方案:DDD+六边形架构落地实践
前言
在业务快速迭代的中早期阶段,微服务架构往往会带来过高的运维成本、团队协作成本与分布式一致性问题;而传统单体架构又容易出现代码腐化、边界模糊、模块耦合严重等问题,难以支撑多业务线并行发展。
本文档提出模块化单体 + DDD领域驱动 + 六边形架构的组合架构方案,既保留单体架构的研发效率、部署简单、调试便捷等优势,又通过严格的边界守护、领域划分与分层设计实现高内聚低耦合,同时预留完整的演进式拆分路径,可随业务规模平滑过渡到微服务架构,全程成本可控、收益明确。
一、架构总览
1.1 核心架构风格
本架构核心定位为模块化单体应用,同时具备以下核心特性:
- 采用无状态设计,天然支持单体应用多机部署,可无缝适配Serverless部署模式
- 同仓多模块,业务域边界清晰,支持按需启停与独立部署
- 全程遵循演进式拆分理念,无需一次性投入微服务的复杂基建
1.2 整体架构模型(DDD + 六边形架构)
架构整体采用DDD分层架构与**六边形架构(端口-适配器)**组合设计,以领域层为核心,通过端口隔离内外交互,所有外部依赖均通过适配器接入,保证领域层的纯粹性与可测试性。
┌───────────────────────────────────────────────────────────┐
│ 驱动端适配器 (Primary) │ 接入适配层
│ HTTP API / WebSocket / 管理后台 / 定时任务 / 事件订阅 │ (调用系统)
├─────────────┬─────────────────────────────┬───────────────┤
│ │ 应用层 (Application) │ │
│ │ 业务用例编排、事务边界 │ │
│ 端口 ├─────────────────────────────┤ 端口 │ 六边形内核
│ (接口) │ 领域层 (Domain) │ (接口) │
│ │ 实体/值对象/领域服务/事件 │ │
│ │ 仓储接口/外部依赖接口 │ │
├─────────────┴─────────────────────────────┴───────────────┤
│ 被驱动端适配器 (Secondary) │ 基础设施层
│ 数据库 / 缓存 / 对象存储 / 消息队列 / 第三方SDK │ (被系统调用)
└───────────────────────────────────────────────────────────┘
1.3 核心设计原则
- 领域优先:以业务领域为核心划分边界,而非以技术层划分模块
- 单向依赖:严格控制依赖方向,领域层不依赖任何外部技术框架
- 边界刚性:没有自动化校验的边界等于没有边界,通过工具强制守护架构边界
- 演进友好:所有设计预留拆分空间,支持按业务规模逐步拆解,不做过度设计
- 高可测试性:领域层可脱离框架独立单元测试,业务规则验证成本极低
二、分层架构详细设计
2.1 分层职责与约束
架构自上而下分为四层,各层职责与约束严格定义如下:
| 分层 | 核心职责 | 关键约束 |
|---|---|---|
| 接口层(接入适配层) | 请求路由、参数校验、DTO转换、权限校验、限流熔断 | 仅作为请求入口,禁止包含任何业务逻辑 |
| 应用层 | 流程编排、事务管理、跨领域模块协调、发布领域事件 | 按业务线独立划分,仅做业务流程组装与事务边界控制,只编排不决策,不包含领域逻辑与业务规则,是业务用例的执行者 |
| 领域层 | 业务规则、领域模型、领域事件、领域服务 | 纯技术无关层,不依赖任何外部框架,不依赖任何上下层,是整个架构的核心 |
| 基础设施层 | 技术实现、外部服务适配、仓储数据持久化实现、消息发送等 | 所有技术组件(数据访问、中间件封装、第三方对接、通用工具)的落地实现,为领域层提供支持,不含业务逻辑 |
2.2 分层依赖规则
架构依赖方向严格单向,核心规则如下:
- 依赖方向唯一 :
接口层 → 应用层 → 领域层 ← 基础设施层,基础设施层反向实现领域层定义的接口,不形成正向依赖 - 领域层中心原则:领域层是架构绝对中心,不依赖任何层,所有外部资源依赖均通过接口注入,必须支持在无任何框架的环境下完成单元测试
- 应用层纯编排:应用层不得包含任何业务规则判断,所有业务逻辑必须下沉至领域层或领域服务
- 仓储依赖倒置:领域层定义抽象仓储接口,基础设施层负责仓储接口的具体实现
三、架构边界刚性守护体系
架构边界必须通过自动化手段强制守护,避免人工约束失效导致架构腐化,从静态校验、自动化测试、接口控制、流程保障四个维度落地。
3.1 静态依赖校验
在编译/运行前阻断非法依赖,不同技术栈对应实现方案如下:
3.1.1 Python技术栈实现
使用 import-linter 工具,配置模块导入规则,在代码提交/构建阶段静态检查模块依赖,发现非法导入直接阻断。
3.1.2 Java技术栈实现
- 使用
maven-enforcer-plugin插件,在编译期直接阻断非法模块依赖 - Spring生态引入
Spring Modulith模块验证能力,在构建阶段自动验证模块访问合法性
3.2 架构自动化测试
通过单元测试阶段自动执行架构校验,将架构规则融入测试流水线:
- Python项目:使用
pytest-archon编写架构测试用例,验证分层依赖、模块边界,每次执行单测自动校验 - Java项目:使用
ArchUnit编写架构测试用例,验证分层依赖、模块边界、循环依赖,每次执行单测自动校验
3.3 接口暴露控制
每个模块仅暴露公共契约,隐藏内部实现,从代码层面限制跨模块非法访问:
- Python项目:每个模块通过
__init__.py的__all__只导出公共接口,隐藏内部实现,其他模块禁止访问未暴露的内容 - Java项目:每个模块仅暴露
api包下的公共接口/DTO/事件,internal/domain/infrastructure包下的所有类一律不对外暴露
3.4 流程与流水线保障
- Code Review检查:重点检查跨模块查表、绕过服务直接操作数据库、反向依赖等架构违规行为
- CI/CD集成:部署流水线集成架构校验步骤,所有架构检查不通过的代码禁止合并与部署
四、模块划分规范与目录结构
4.1 模块划分核心原则
模块划分严格遵循限界上下文原则,具体规则如下:
- 一个领域一个模块:边界清晰,高内聚低耦合;例如用户、支付、商品、旅游、出行、外卖各为一个独立模块
- 业务线完全隔离:旅游、出行、外卖等业务线模块平级,互相不可见,禁止直接依赖
- 公共能力下沉:所有业务线共享的能力,必须收敛到核心域模块,禁止业务线各自实现
- 核心域无业务感知:通用核心模块只提供不可变的基础原子能力;场景特定概念由各业务线模块在自己的领域内扩展,通过关联字段引用核心实体,核心域不感知业务线场景
- 技术实现收敛:所有底层技术组件统一收敛到基础设施层,不允许业务模块自行实现数据库操作、第三方调用
- 按限界上下文划分,而非前后台分层:每个模块都有自己的完整分层,前台业务模块的领域层负责场景特定概念,中台核心模块的领域层负责通用原子能力
- 粒度适中,避免过度拆分:过细拆分模块会显著增加工程复杂度与协调成本,若两个模块始终同步变更(如用户与认证),应允许合并为一个模块,而非强行维持独立边界
4.2 模块分类与定位
模块分为两大类,定位明确,权责清晰:
- 业务线模块/前台业务模块:面向具体业务场景,包含完整的分层结构,领域层聚焦场景特定业务规则,例如旅游、出行、外卖、AI助手
- 通用核心模块/中台能力模块:提供通用原子能力,领域层更厚,被所有业务线模块依赖,例如用户、支付、订单中心
4.3 Python项目标准目录结构
backend-python/
├── framework/ # 公共框架(统一响应、异常处理器、通用插件等)
├── server # 启动入口
│ ├── .env.example # 环境变量示例
│ ├── worker_main.py # 异步任务Worker独立入口:同仓不同部署,资源隔离
│ └── main.py # Web服务主入口:路由聚合、模块加载、依赖注入容器初始化
├── adapters/ # 【驱动端适配器 / 接入适配层】Primary Adapter
│
│ # ========== 业务线模块/前台业务模块(完整模块,有自己的领域层)==========
├── travel/ # 旅游业务
│ ├── api/ # 模块唯一对外出口(端口)
│ │ ├── event/ # 本模块发布的领域事件
│ │ ├── dto/ # 接口交互实体定义
│ │ └── interface/ # 本模块暴露的接口(供其他模块或适配器调用)
│ └── internal/ # 内部实现,外部禁止访问
│ ├── application/ # 领域内应用服务(仅操作自身域)
│ ├── domain/ # 领域实体、值对象、领域服务、仓储接口
│ └── infrastructure/ # 仓储实现、ORM、第三方对接
├── ride/ # 拼车业务
│ ├── api/ # 模块唯一对外出口(端口)
│ │ ├── event/ # 本模块发布的领域事件
│ │ ├── dto/ # 接口交互实体定义
│ │ └── interface/ # 本模块暴露的接口(供其他模块或适配器调用)
│ └── internal/ # 内部实现,外部禁止访问
│ ├── application/ # 领域内应用服务(仅操作自身域)
│ ├── domain/ # 领域实体、值对象、领域服务、仓储接口
│ └── infrastructure/ # 仓储实现、ORM、第三方对接
├── delivery/ # 外卖业务
│ ├── api/ # 模块唯一对外出口(端口)
│ │ ├── event/ # 本模块发布的领域事件
│ │ ├── dto/ # 接口交互实体定义
│ │ └── interface/ # 本模块暴露的接口(供其他模块或适配器调用)
│ └── internal/ # 内部实现,外部禁止访问
│ ├── application/ # 领域内应用服务(仅操作自身域)
│ ├── domain/ # 领域实体、值对象、领域服务、仓储接口
│ └── infrastructure/ # 仓储实现、ORM、第三方对接
├── ai_assistant/ # AI助手业务
│ ├── api/ # 模块唯一对外出口(端口)
│ │ ├── event/ # 本模块发布的领域事件
│ │ ├── dto/ # 接口交互实体定义
│ │ └── interface/ # 本模块暴露的接口(供其他模块或适配器调用)
│ └── internal/ # 内部实现,外部禁止访问
│ ├── application/ # 领域内应用服务(仅操作自身域)
│ ├── domain/ # 领域实体、值对象、领域服务、仓储接口
│ └── infrastructure/ # 仓储实现、ORM、第三方对接
│
│ # ========== 通用核心模块/中台能力模块(完整模块,领域层更厚)==========
├── user/ # 用户领域模块(业务中台中心域,提供通用原子能力)
│ ├── api/ # 模块唯一对外出口(端口)
│ │ ├── event/ # 本模块发布的领域事件
│ │ ├── dto/ # 接口交互实体定义
│ │ └── interface/ # 本模块暴露的接口(供其他模块或适配器调用)
│ └── internal/ # 内部实现,外部禁止访问
│ ├── application/ # 领域内应用服务(仅操作自身域)
│ ├── domain/ # 领域实体、值对象、领域服务、仓储接口
│ └── infrastructure/ # 仓储实现、ORM、第三方对接
├── payment/ # 支付领域模块(业务中台中心域,提供通用原子能力)
│ ├── api/ # 模块唯一对外出口(端口)
│ │ ├── event/ # 本模块发布的领域事件
│ │ ├── dto/ # 接口交互实体定义
│ │ └── interface/ # 本模块暴露的接口(供其他模块或适配器调用)
│ └── internal/ # 内部实现,外部禁止访问
│ ├── application/ # 领域内应用服务(仅操作自身域)
│ ├── domain/ # 领域实体、值对象、领域服务、仓储接口
│ └── infrastructure/ # 仓储实现、ORM、第三方对接
├── order/ # 订单中心领域模块(业务中台中心域,提供通用原子能力)
│ ├── api/ # 模块唯一对外出口(端口)
│ │ ├── event/ # 本模块发布的领域事件
│ │ ├── dto/ # 接口交互实体定义
│ │ └── interface/ # 本模块暴露的接口(供其他模块或适配器调用)
│ └── internal/ # 内部实现,外部禁止访问
│ ├── application/ # 领域内应用服务(仅操作自身域)
│ ├── domain/ # 领域实体、值对象、领域服务、仓储接口
│ └── infrastructure/ # 仓储实现、ORM、第三方对接
└── requirements.txt # Python 依赖
4.4 Java项目标准目录结构
backend-java/
├── framework/ # 公共框架(统一响应、异常处理器、通用插件等)
├── server/ # 启动入口
│ └── src/main/java
│ └── com/company/platform/
│ └──Application.java
├── adapters/ # 【驱动端适配器 / 接入适配层】Primary Adapter
│
│ # ========== 业务线模块/前台业务模块(完整模块,有自己的领域层)==========
├── travel/ # 旅游业务
│ ├── api/ # 模块唯一对外出口(端口)
│ │ ├── event/ # 本模块发布的领域事件
│ │ ├── dto/ # 接口交互实体定义
│ │ └── interface/ # 本模块暴露的接口(供其他模块或适配器调用)
│ └── internal/ # 内部实现,外部禁止访问
│ ├── application/ # 领域内应用服务(仅操作自身域)
│ ├── domain/ # 领域实体、值对象、领域服务、仓储接口
│ └── infrastructure/ # 仓储实现、ORM、第三方对接
├── ride/ # 拼车业务
│ ├── api/ # 模块唯一对外出口(端口)
│ │ ├── event/ # 本模块发布的领域事件
│ │ ├── dto/ # 接口交互实体定义
│ │ └── interface/ # 本模块暴露的接口(供其他模块或适配器调用)
│ └── internal/ # 内部实现,外部禁止访问
│ ├── application/ # 领域内应用服务(仅操作自身域)
│ ├── domain/ # 领域实体、值对象、领域服务、仓储接口
│ └── infrastructure/ # 仓储实现、ORM、第三方对接
├── delivery/ # 外卖业务
│ ├── api/ # 模块唯一对外出口(端口)
│ │ ├── event/ # 本模块发布的领域事件
│ │ ├── dto/ # 接口交互实体定义
│ │ └── interface/ # 本模块暴露的接口(供其他模块或适配器调用)
│ └── internal/ # 内部实现,外部禁止访问
│ ├── application/ # 领域内应用服务(仅操作自身域)
│ ├── domain/ # 领域实体、值对象、领域服务、仓储接口
│ └── infrastructure/ # 仓储实现、ORM、第三方对接
├── ai_assistant/ # AI助手业务
│ ├── api/ # 模块唯一对外出口(端口)
│ │ ├── event/ # 本模块发布的领域事件
│ │ ├── dto/ # 接口交互实体定义
│ │ └── interface/ # 本模块暴露的接口(供其他模块或适配器调用)
│ └── internal/ # 内部实现,外部禁止访问
│ ├── application/ # 领域内应用服务(仅操作自身域)
│ ├── domain/ # 领域实体、值对象、领域服务、仓储接口
│ └── infrastructure/ # 仓储实现、ORM、第三方对接
│
│ # ========== 通用核心模块/中台能力模块(完整模块,领域层更厚)==========
├── user/ # 用户领域模块(业务中台中心域,提供通用原子能力)
│ ├── api/ # 模块唯一对外出口(端口)
│ │ ├── event/ # 本模块发布的领域事件
│ │ ├── dto/ # 接口交互实体定义
│ │ └── interface/ # 本模块暴露的接口(供其他模块或适配器调用)
│ └── internal/ # 内部实现,外部禁止访问
│ ├── application/ # 领域内应用服务(仅操作自身域)
│ ├── domain/ # 领域实体、值对象、领域服务、仓储接口
│ └── infrastructure/ # 仓储实现、ORM、第三方对接
├── payment/ # 支付领域模块(业务中台中心域,提供通用原子能力)
│ ├── api/ # 模块唯一对外出口(端口)
│ │ ├── event/ # 本模块发布的领域事件
│ │ ├── dto/ # 接口交互实体定义
│ │ └── interface/ # 本模块暴露的接口(供其他模块或适配器调用)
│ └── internal/ # 内部实现,外部禁止访问
│ ├── application/ # 领域内应用服务(仅操作自身域)
│ ├── domain/ # 领域实体、值对象、领域服务、仓储接口
│ └── infrastructure/ # 仓储实现、ORM、第三方对接
├── order/ # 订单中心领域模块(业务中台中心域,提供通用原子能力)
│ ├── api/ # 模块唯一对外出口(端口)
│ │ ├── event/ # 本模块发布的领域事件
│ │ ├── dto/ # 接口交互实体定义
│ │ └── interface/ # 本模块暴露的接口(供其他模块或适配器调用)
│ └── internal/ # 内部实现,外部禁止访问
│ ├── application/ # 领域内应用服务(仅操作自身域)
│ ├── domain/ # 领域实体、值对象、领域服务、仓储接口
│ └── infrastructure/ # 仓储实现、ORM、第三方对接
└── pom.xml # Maven依赖管理
五、核心运行机制
5.1 多维度按需启停
架构支持三级粒度的按需启停,适配多业务线差异化运营需求:
- 支持系统级、模块级、接口级别按需启停
- 适配多业务线逐步上线、差异化部署、灰度发布等场景
- 配置支持热加载,启停无需重启服务
5.2 异步任务设计
异步任务采用同仓异构部署模式,兼顾研发效率与资源隔离:
- 代码同仓:异步任务代码与主应用在同一仓库,共享应用层与领域层代码,避免重复开发
- 可独立部署:计算密集型/耗时任务可独立部署,实现资源隔离,无需拆分服务
- 自动按需启用:根据关联模块启动配置自动按需启用对应任务,无需单独配置控制;主应用启动时可提示当前依赖的任务列表
5.3 模块间交互规则
5.3.1 交互总原则
- 业务线模块之间,一般情况下禁止横向调用,完全隔离
- 若需跨业务数据交互,可通过公共核心域中转,或通过领域事件解耦
- 特殊场景下,当页面组装逻辑过于复杂时,允许业务线模块依赖其他业务线模块的 Query Service(只读服务),但禁止调用任何命令/写操作,且Query Service只能返回扁平DTO,不能暴露领域实体
5.3.2 模块依赖关系规范
- 业务线模块/前台业务模块,允许依赖通用核心模块/中台能力模块
- 业务线模块/前台业务模块之间,绝对禁止依赖
- 通用核心模块/中台能力模块之间,可以有向无环依赖,禁止循环依赖
- 模块之间只能依赖接口,不能依赖具体实现
- 领域实体禁止跨模块传递,必须转换为DTO后交互
5.3.3 通信方式选型
- 同步调用API:仅用于强依赖、强一致性场景
- 异步事件通知:用于弱依赖、最终一致性场景,优先推荐
5.3.4 领域事件规范
- 事件Schema属于发布方的业务契约,应放在发布方模块的
api/event/目录下 - 消费者只依赖事件Schema,不依赖发布方的其他内部实现
5.3.5 跨模块事务处理
根据架构演进阶段采用不同方案:
- L0-L1(单库阶段) :
- 允许通过共享事务管理器实现跨模块本地事务,但必须在应用层显式声明
- 禁止在领域层直接操作其他模块的表(即使同事务)
- L2+(多进程阶段) :
- 强一致性场景必须使用 Saga 编排 / TCC 框架
- 推荐优先使用异步事件实现最终一致性
六、数据架构设计
6.1 单库分域设计
采用物理同库、逻辑隔离的数据库设计方案:
- 统一使用领域表前缀实现逻辑隔离,例如
user_xxx、order_xxx - 设计上严格按照分库标准执行,预留未来拆库的所有条件
- 避免跨域表关联、跨域外键等设计,为后续物理拆库扫清障碍
6.2 跨域数据查询规范
- 禁止跨域操作数据表:任何情况下不允许SQL层面跨域关联查询
- 禁止绕过仓储直接写SQL:所有数据库操作必须通过仓储层封装,禁止在业务代码里直接写ORM查询
- 小数据量场景:应用层调用多个领域服务获取数据,在内存中组装后返回
- 大数据量/复杂查询/聚合统计场景:通过冗余宽表实现,例如订单统计、业务报表,通过领域事件同步数据到独立的查询宽表/数仓,专门用于查询
- 高实时性+大数据量场景:采用物化视图或独立查询服务,根据业务演进逐步引入
- 性能优化手段:读请求走只读实例,热点数据走缓存,从性能层面缓解单库压力,无需急于拆库
6.3 缓存设计规范
- 缓存抽象层 :在framework或基础设施层提供统一缓存接口(如
CacheService),屏蔽底层缓存实现 - 缓存按域隔离 :按领域模块划分缓存命名空间,例如
travel:*、order:*,避免key冲突 - 缓存一致性策略 :
- 优先采用 Cache-Aside 模式:读时回源,写时删除缓存
- 禁止在领域层直接操作缓存,必须通过仓储层封装
- 跨模块缓存失效:通过监听领域事件,异步清除关联模块的相关缓存
七、统一技术底座规范
7.1 四大基础统一规范
所有模块必须遵循统一技术底座,避免各业务线重复造轮子与规范不一致:
- 统一异常体系
- 统一日志规范
- 统一配置管理
- 统一接口返回格式
7.2 安全与合规体系
- 数据脱敏:用户隐私数据(手机号、身份证等)入库加密、出参脱敏;支持可搜索加密(如确定性加密技术);脱敏通过注解+序列化器统一处理,避免业务代码侵入
- 支付合规:支付域单独管控,流水记录完整,敏感操作全量日志留痕,满足金融监管要求
- 操作审计:管理后台所有关键操作留痕,核心数据变更记录操作人、操作时间、变更内容
7.3 日志与可观测性
- 日志按模块打标,便于按域排查问题
- 请求全链路日志支持一键开启/关闭
- 全链路TraceId支持,贯穿所有模块与异步任务
- 可按模块、接口粒度开启/关闭日志,灵活控制日志量级
八、全链路测试体系
8.1 测试分层策略
- 单元测试:聚焦领域层业务规则,覆盖核心业务逻辑,可脱离框架独立运行
- 集成测试:验证应用层流程编排合理性、事务边界正确性、仓储层数据访问正确性、领域事件发布时机准确性
- 架构测试:防止架构腐化,通过自动化用例强制校验架构规则
- 端到端测试:覆盖核心业务主链路,验证整体流程可用性
8.2 架构测试检查清单
架构测试必须覆盖以下核心校验项:
- 接口层不依赖领域层和基础设施层,只能依赖应用层接口
- 领域层不依赖任何外部框架、数据库、ORM组件
- 业务线模块之间无任何依赖
- 所有模块的internal包不被其他模块导入
- 仓储实现仅存在于基础设施层
- 禁止循环依赖(包括通用核心模块之间)
- 应用层不包含领域逻辑,可结合命名规范辅助检查(如 ApplicationService 中不出现业务判断关键词)
- 事务注解只能出现在应用层,权限注解只能出现在接口层
九、工程落地最佳实践
9.1 事务管理规范
- 精挑细选事务隔离级别,根据业务场景合理选择
- 明智选择锁策略,避免过度加锁导致性能问题
- 严格控制事务范围,事务要"短小精悍",避免长事务
- 核心场景(如库存扣减、支付流转)事务逻辑必须严谨,防止并发问题
9.2 依赖注入实现
- Java技术栈:Spring生态天然支持依赖注入,通过注解完成Bean管理与注入
- Python技术栈:使用
dependency-injector框架实现依赖注入容器,完成各层依赖的解耦与管理
十、部署架构
- 无状态设计:所有服务实例无状态,天然支持水平扩展
- 多部署形态支持:支持单/多Docker容器部署、ECS部署、Serverless部署
- 按需部署:支持按模块选择启用部署,不同环境可部署不同模块组合
十一、演进式拆分体系
模块化单体的拆分不是「要么单体要么微服务」的二元选择,而是按「部署维度 → 运行时维度 → 数据维度」逐层拆解,哪一层出问题拆哪一层,每一步都成本可控、收益明确,且全程保留单体的研发效率优势。
11.1 三维拆分路径
| 拆分维度 | 核心动作 | 解决的核心问题 | 架构复杂度增量 |
|---|---|---|---|
| 部署维度 | 同代码、同库,按业务 / 模块拆分部署集群,网关分流 | 资源争抢、模块间互相影响、独立扩缩容 | 极低(纯运维操作,零代码改动) |
| 运行时维度 | 同库,按领域拆分为独立进程,通过 RPC/HTTP 通信 | 发布隔离、故障隔离、团队协作冲突 | 中等(需做接口改造,无分布式事务难题) |
| 数据维度 | 按领域拆库,服务完全独立数据源 | 单库性能瓶颈、数据隔离合规要求 | 高(需解决分布式一致性、数据同步) |
11.2 五级拆分阶梯
| 阶梯 | 架构形态 | 核心特征 | 适用阶段 |
|---|---|---|---|
| L0 模块化单体 | 单部署集 + 单进程 + 单库 | 所有模块跑在同一个实例,共用数据库 | 0-1 万日活,业务验证期 |
| L1 部署集拆分 | 多部署集 + 单代码 + 单库 | 同一份代码部署多个集群,按接口/模块分流,资源隔离 | 1-10 万日活,出现模块资源争抢 |
| L2 进程级拆分(分布式单体) | 多进程 + 单库 | 核心模块拆为独立进程,通过轻量 RPC 通信,数据库共用 | 10-50 万日活,发布 / 故障隔离需求强烈 |
| L3 数据级拆分 | 多进程 + 多库 | 核心领域拆独立数据库,服务间数据物理隔离 | 50 万 + 日活,单库出现性能瓶颈 |
| L4 完整微服务 | 全服务化 + 服务治理 | 完整的注册中心、配置中心、链路追踪、分布式事务体系 | 百万级日活,团队规模 50+ |
十二、架构契约与落地保障
- 架构设计需形成完整的契约文档,作为所有研发人员的开发准则
- AI编码工具需严格按照架构契约执行开发,保证代码生成符合架构规范
- 架构契约迭代需经过评审,同步更新所有自动化校验规则,避免契约与实现脱节
总结
本架构方案的核心价值在于平衡当下研发效率与未来架构扩展性,既避免了微服务早期的过度设计与高成本,又通过严格的边界守护与领域划分解决了传统单体的腐化问题。对于多业务线并行发展、处于快速成长期的团队,模块化单体是性价比极高的架构选型,可伴随业务规模平滑演进,始终匹配当前阶段的研发与运维能力。