综合架构练习
C4 图与 ADR 小项目。
40 分钟
综合架构练习:C4 模型 + ADR 实战
这一课你将能做到
- 用 C4 模型的四个层级(系统上下文、容器、组件、代码)画出判题平台架构图
- 用 ADR(架构决策记录)格式记录"为什么选六边形架构而不是分层"
- 把前面 10 课的知识整合成一个可落地的架构方案
为什么要学
前面学了整洁代码、设计原则、OOP、范式、模式、架构原则、架构风格、架构模式、DDD、企业模式,这一课要把它们串起来。C4 模型是"怎么画架构图",ADR 是"怎么记录决策"。两者结合,让架构不再是"脑子里的想法",而是"可评审、可追溯、可传承"的文档。
先建立图像
C4 四层
─────────
L1 系统上下文:判题平台在用户、判题引擎、DB 之间的位置
L2 容器:Web 应用、判题服务、数据库、消息队列
L3 组件:Web 应用内的 Controller、Service、Repository
L4 代码:具体类和方法(可选,一般用 IDE 生成)
ADR 格式
─────────
标题:选择六边形架构
状态:已接受
上下文:判题平台需要支持多语言判题和多种存储
决策:采用六边形架构,核心领域不依赖框架
后果:代码量 +20%,但测试和框架迁移成本降低
跟着做
步骤 1:C4 L1——系统上下文图
判题平台在整体生态中的位置:
┌─────────┐ ┌─────────────┐ ┌─────────┐
│ 用户 │────→│ 判题平台 │────→│ 判题引擎 │
│ (Web) │ │ (Spring Boot)│ │ (Docker)│
└─────────┘ └─────────────┘ └─────────┘
│
↓
┌─────────────┐
│ MySQL │
│ Redis/MQ │
└─────────────┘
判题平台是中心,上游是用户,下游是判题引擎和存储。
步骤 2:C4 L2——容器图
┌─────────────────────────────────────┐
│ 判题平台系统 │
├─────────┐ ┌─────────┐ ┌─────────┐│
│ Web 应用 │ │ 判题服务 │ │ 通知服务 ││
│(Spring) │ │(Spring) │ │(Spring) ││
│ :8080 │ │ :8081 │ │ :8082 ││
└────┬────┘ └────┬────┘ └────┬────┘│
│ │ │ │
└────────────┴────────────┘ │
│ │
┌─────────────┐ │
│ RabbitMQ │ │
│ (事件总线) │ │
└─────────────┘ │
│ │
┌─────────────┐ │
│ MySQL │ │
│ Redis │ │
└─────────────┘ │
└─────────────────────────────────────┘
Web 应用接收提交,发事件到 MQ;判题服务消费事件,执行判题;通知服务消费结果事件,推送 WebSocket。
步骤 3:C4 L3——组件图(Web 应用内部)
┌─────────────────────────────┐
│ Web 应用 │
├─────────┐ ┌─────────────┐ │
│Controller│ │ Service │ │
│Submission│→│ Submission │ │
│Controller│ │ Service │ │
└─────────┘ └──────┬──────┘ │
│ │
┌─────────────┐ │
│ Domain │ │
│ Submission │ │
│ Aggregate │ │
└─────────────┘ │
│ │
┌─────────────┐ │
│ Repository │ │
│ Interface │ │
└─────────────┘ │
└─────────────────────────────┘