前言
本文章讲解如何进行系统架构设计,从而将需求落地,
参考DDD+Hexagonal/Onion/Clean Architecture
1️⃣ 需求澄清 & 领域探索(DDD 战略设计)
- 与领域专家(业务方)做 Event Storming / Process Mapping
- 输出
- 业务流程与痛点
- 初步的通用语言 (Ubiquitous Language)
- 限界上下文图 (Context Map)
纯白板、便利贴阶段,不写代码。
2️⃣ 搭起最小骨架(Clean/Hex 框架雏形)
- 建仓库/Workspace,先把四层目录搭好
bash
# 空壳
domain/
application/
infrastructure/
app/
- 在 domain 放最核心的概念雏形(Entity/Value Object),可以先只有 ID、Name 等字段。
- 在 application 放 1-2 个 Port/Trait(用例层接口),比如 Notifier, PriceFeed。
- infrastructure 里给 Port 写 空实现 / stub,返回硬编码值即可。
- app/main.rs 只做依赖装配,能编译跑起来。
骨架先立好,后续任何 slice 都可以往里加。
3️⃣ 选一个"垂直切片"做深入
-
选最具价值、最能走通链路的用户场景
例:监听某交易对 → 价格满足条件 → 推送 Bark 通知。
-
对这个场景
- 在 domain 内建模:Candle, Strategy, Message ...
- 在 application 写用例服务:TradeMonitorService::check()
- Infra 写真正 adapter:BarkNotifier(调用 reqwest)
做到 测试用例能跑通 & 手动验证一遍 即算一个增量。
4️⃣ 红-绿-重构循环
- 用 纯 Domain 层单元测试 固化规则;无 IO → 跑得快。
- Application 层用 mock(自动 or 手写)测业务流程。
- Infra 层做集成测试 / contract test。
- 任何规则变化,优先改 Domain;任何技术替换,只改 Infra;依赖箭头保证二者互不污染。
5️⃣ 持续迭代:扩展模型 & 上更多 Adapter
每来一个新需求,就重复 3-4 步:
- 先在 Domain 丰富模型
- 再在 Application 暴露 Port
- 最后写/替换 Infra Adapter
- main.rs 装配 & 发布
6️⃣ 战术 DDD 与重构
当 Domain 内出现复杂 Invariant / 领域事件时:
- 引入 Aggregate、Factory、Domain Event 等 DDD tactical pattern。
- 若模型膨胀,可拆分为多个限界上下文,各自一套 Clean 同心圆;上下文之间用事件或 API 集成。 时间线示意
bash
需求 → 领域探索
↘ 同步
骨架搭建 ------┐
↓(小步)
垂直切片① → 红绿重构 → 发布
↘
垂直切片② → 红绿重构 → 发布
... 迭代 ...
常见疑问
问题 | 答案 |
---|---|
一开始就把全部领域模型画完吗? | 不推荐,易脱节。用"Just-Enough Modeling + Vertical Slice"逐步完善。 |
Clean/Hex 会不会过度工程? | 对很小的脚本项目是的;但策略交易、风控、支付等需要长生命周期的系统,清晰依赖边界能显著降低维护成本。 |
什么时候把 Stub 换成真实现? | 当某条业务流需要真正落地时再替换,优先保证内圈规则稳定。 |
需要 IOC/DI 框架吗? | Rust 手动装配足够,main.rs new 一把塞进 Service;trait object 天然就是 Port。 |
总结
- 先用 DDD 方法与业务方对齐语言与边界。
- 迅速落一个 Clean/Hex 骨架,确保依赖箭头正确。
- 以"垂直切片"方式迭代:Domain → Application → Infra。
- 始终保持内圈纯净、外圈可替换,这样系统才能随业务演变而柔韧不崩。