30d - 架构审查清单与反模式
本文是《AI Agent 实战手册》第 30 章第 4 节。 上一节:30c-系统设计文档AI生成 | 下一章:31a-AI辅助测试概览
概述
架构审查是软件工程中投入产出比最高的质量保障活动——在代码编写之前发现架构缺陷,修复成本仅为生产环境发现时的 1/100。2025-2026 年,AI 驱动的架构审查正在从”人工逐项检查”演进为”AI 自动扫描 + 人工确认”的协作模式:AI Agent 可以自动分析代码库的架构健康度、检测架构漂移、识别反模式,并生成结构化的审查报告。本节提供完整的 AI 辅助架构审查清单(按六大维度分类)、至少 12 个架构反模式目录(含症状、根因和解决方案)、架构漂移检测方法、AI 驱动的架构健康度评估框架、Prompt 模板库,以及防止架构退化的 Steering 规则模板。
1. AI 辅助架构审查的完整工作流
1.1 架构审查的演进
| 阶段 | 时间 | 方式 | 效率 | 覆盖度 |
|---|---|---|---|---|
| 传统人工审查 | 2018-2023 | 架构师手动检查清单、会议评审 | 低(数天/次) | 依赖经验,容易遗漏 |
| 工具辅助审查 | 2023-2024 | SonarQube + ArchUnit + 人工审查 | 中(数小时/次) | 结构性问题覆盖好,设计问题仍依赖人工 |
| AI 驱动审查 | 2025-2026 | AI Agent 自动扫描 + 人工确认 | 高(数分钟/次) | 结构 + 设计 + 运维全覆盖 |
1.2 端到端审查工作流
┌─────────────────────────────────────────────────────────────────────┐
│ AI 辅助架构审查端到端工作流 │
├─────────────────────────────────────────────────────────────────────┤
│ │
│ ① 输入准备 ② AI 自动扫描 ③ 问题分类 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 代码仓库 │─────→│ 依赖分析 │──────→│ P0 阻断性 │ │
│ │ 设计文档 │ │ 模块边界 │ │ P1 重要 │ │
│ │ ADR 记录 │ │ 反模式检测│ │ P2 建议 │ │
│ │ Steering │ │ 漂移检测 │ │ P3 优化 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │ │
│ ④ 人工确认 ⑤ 修复跟踪 ⑥ 持续监控 │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ 架构师审查│─────→│ 创建任务 │──────→│ CI/CD 集成│ │
│ │ 误报过滤 │ │ 优先排序 │ │ PR 级审查 │ │
│ │ 补充发现 │ │ 迭代修复 │ │ 定期扫描 │ │
│ └──────────┘ └──────────┘ └──────────┘ │
│ │
└─────────────────────────────────────────────────────────────────────┘1.3 架构审查工具推荐
| 工具 | 类型 | 核心能力 | 价格 | 适用场景 |
|---|---|---|---|---|
| SonarQube Architecture | 架构分析平台 | 架构可视化、意图架构 vs 实际架构对比、架构约束定义(YAML)、循环依赖检测 | 免费(Community)/ $180/年起(Developer)/ 企业定价 | 持续架构治理,CI/CD 集成架构质量门 |
| CodeScene | 行为代码分析 | 架构热点分析、技术债务可视化、团队耦合分析、变更预测、PR 级架构审查 | $15/月起 / 企业定价 | 架构健康度监控,识别高风险变更区域 |
| ArchUnit | 架构测试框架 | Java/Kotlin 架构规则测试、分层约束、依赖检查、命名规范 | 免费(开源) | Java 项目架构约束自动化测试 |
| Dependency Cruiser | 依赖分析 | JavaScript/TypeScript 依赖图生成、循环依赖检测、架构规则验证 | 免费(开源) | 前端/Node.js 项目依赖治理 |
| Claude Code | AI Agent | 全项目架构理解、反模式检测、架构审查报告生成、Steering 规则约束 | $20/月(Pro)/ $200/月(Max 20x) | AI 驱动的深度架构审查 |
| CodeRabbit | AI 代码审查 | PR 级架构审查、架构图自动生成、一键修复建议、GitHub/GitLab 集成 | 免费(开源)/ $12/月(Pro) | PR 工作流中的自动架构审查 |
| Sourcegraph Cody | 代码智能 | 大型代码库架构理解、跨仓库搜索、架构依赖分析 | 免费 / $9/月(Pro)/ 企业定价 | 大型代码库的架构导航和理解 |
| Archimetric | AI 架构文档 | 代码仓库→架构文档、C4 模型自动生成、持续同步、漂移检测 | 免费(Beta)/ 付费计划待定 | 从代码逆向生成架构文档并持续同步 |
| Kiro | Agentic IDE | Spec 驱动架构设计、Steering 规则约束、Hooks 自动验证架构一致性 | 免费(50 Vibe)/ $19/月(Pro) | 结构化架构设计和持续约束 |
2. 架构审查清单(按六大维度分类)
架构审查清单是系统化审查的核心工具。以下清单按六大维度组织,每个维度包含具体的审查问题和优先级标注。AI 可以自动执行大部分检查项,人工聚焦于需要业务判断的高优先级问题。
2.1 维度一:功能完整性
目标:确保架构方案完整覆盖所有功能需求,无遗漏、无重叠。
| # | 审查问题 | 优先级 | AI 可自动化 |
|---|---|---|---|
| F1 | 所有核心功能是否都有对应的组件/服务承载? | 🔴 P0 | ✅ 对比需求文档和架构图 |
| F2 | 是否存在功能职责重叠的组件? | 🟡 P1 | ✅ 分析组件接口和数据流 |
| F3 | 跨组件的业务流程是否有完整的端到端设计? | 🔴 P0 | 🔶 需要序列图验证 |
| F4 | 异步流程(消息队列、事件驱动)是否有完整的失败处理? | 🔴 P0 | ✅ 检查死信队列和重试配置 |
| F5 | 第三方集成是否有降级方案? | 🟡 P1 | 🔶 需要审查熔断器配置 |
| F6 | 数据一致性策略是否明确(强一致/最终一致)? | 🔴 P0 | ❌ 需要业务判断 |
| F7 | 多租户隔离策略是否完整(数据/计算/网络)? | 🟡 P1 | ✅ 检查隔离实现 |
2.2 维度二:非功能需求
目标:确保架构方案满足性能、可用性、可扩展性等质量属性要求。
| # | 审查问题 | 优先级 | AI 可自动化 |
|---|---|---|---|
| N1 | 性能瓶颈在哪里?是否有应对策略? | 🔴 P0 | 🔶 可识别潜在瓶颈点 |
| N2 | 单点故障(SPOF)在哪里?如何消除? | 🔴 P0 | ✅ 分析架构图中的单点 |
| N3 | 水平扩展策略是否明确?哪些组件是有状态的? | 🔴 P0 | ✅ 检查状态管理方式 |
| N4 | 数据库读写分离/分片策略是否合理? | 🟡 P1 | 🔶 需要结合数据量判断 |
| N5 | 缓存策略是否完整(缓存穿透/击穿/雪崩防护)? | 🟡 P1 | ✅ 检查缓存配置 |
| N6 | 响应时间 SLA 是否有对应的架构保障? | 🔴 P0 | ❌ 需要性能测试验证 |
| N7 | 并发控制策略是否明确(乐观锁/悲观锁/分布式锁)? | 🟡 P1 | ✅ 检查锁实现 |
| N8 | 限流和熔断策略是否配置? | 🔴 P0 | ✅ 检查中间件配置 |
2.3 维度三:可维护性
目标:确保架构方案易于理解、修改和扩展,技术债务可控。
| # | 审查问题 | 优先级 | AI 可自动化 |
|---|---|---|---|
| M1 | 组件边界是否清晰?耦合度是否可接受? | 🔴 P0 | ✅ 分析依赖关系图 |
| M2 | 是否存在循环依赖? | 🔴 P0 | ✅ 依赖分析工具检测 |
| M3 | 新功能添加的典型路径是什么?需要修改几个组件? | 🟡 P1 | 🔶 需要场景分析 |
| M4 | 是否有”上帝模块”(职责过多的组件)? | 🟡 P1 | ✅ 分析模块大小和依赖数 |
| M5 | 外部依赖是否通过适配器/接口隔离? | 🟡 P1 | ✅ 检查依赖注入模式 |
| M6 | 配置是否外部化?是否支持不同环境? | 🟢 P2 | ✅ 检查配置管理方式 |
| M7 | API 版本管理策略是否明确? | 🟡 P1 | ✅ 检查 API 路由和版本标记 |
| M8 | 代码和架构文档是否同步? | 🟢 P2 | ✅ 对比文档和代码结构 |
2.4 维度四:运维就绪
目标:确保架构方案具备生产环境运维所需的可观测性、可部署性和可恢复性。
| # | 审查问题 | 优先级 | AI 可自动化 |
|---|---|---|---|
| O1 | 监控策略是否完整(指标/日志/链路追踪)? | 🔴 P0 | ✅ 检查监控配置 |
| O2 | 告警规则是否定义?告警升级路径是否明确? | 🔴 P0 | ✅ 检查告警配置 |
| O3 | 部署策略是否支持零停机(蓝绿/金丝雀/滚动)? | 🟡 P1 | ✅ 检查部署配置 |
| O4 | 回滚方案是否可行?回滚时间是否可接受? | 🔴 P0 | 🔶 需要验证回滚流程 |
| O5 | 灾难恢复方案是否明确(RTO/RPO)? | 🟡 P1 | ❌ 需要业务判断 |
| O6 | 数据备份策略是否完整?恢复是否经过测试? | 🟡 P1 | ✅ 检查备份配置 |
| O7 | 日志是否结构化?是否包含足够的排查信息? | 🟡 P1 | ✅ 检查日志格式和级别 |
| O8 | 健康检查端点是否实现? | 🔴 P0 | ✅ 检查 /health 端点 |
| O9 | 配置变更是否可以不重启服务生效? | 🟢 P2 | ✅ 检查配置热加载 |
2.5 维度五:成本效益
目标:确保架构方案的成本合理,避免过度设计和资源浪费。
| # | 审查问题 | 优先级 | AI 可自动化 |
|---|---|---|---|
| C1 | 基础设施成本估算是否合理?是否有预算超支风险? | 🔴 P0 | 🔶 可估算云资源成本 |
| C2 | 是否存在过度设计(当前规模不需要的复杂度)? | 🔴 P0 | 🔶 对比需求规模和架构复杂度 |
| C3 | 成本随规模增长的曲线是否可预测? | 🟡 P1 | 🔶 可建模成本曲线 |
| C4 | 是否有成本优化空间(预留实例、Spot 实例、Serverless)? | 🟡 P1 | ✅ 分析资源使用模式 |
| C5 | 第三方服务的定价模型是否可持续?是否有替代方案? | 🟡 P1 | ✅ 对比定价方案 |
| C6 | 开发和运维的人力成本是否在团队承受范围内? | 🔴 P0 | ❌ 需要团队评估 |
| C7 | 技术债务的”利息”是否在可控范围内? | 🟡 P1 | 🔶 可分析代码复杂度趋势 |
2.6 维度六:安全性
目标:确保架构方案具备完整的安全防护,满足合规要求。
| # | 审查问题 | 优先级 | AI 可自动化 |
|---|---|---|---|
| S1 | 认证方案是否安全(JWT 签名算法、Token 过期策略)? | 🔴 P0 | ✅ 检查认证配置 |
| S2 | 授权模型是否遵循最小权限原则? | 🔴 P0 | ✅ 分析权限配置 |
| S3 | 数据传输是否加密(TLS 1.3)? | 🔴 P0 | ✅ 检查 TLS 配置 |
| S4 | 敏感数据是否静态加密?密钥管理方案是否安全? | 🔴 P0 | ✅ 检查加密配置 |
| S5 | 输入验证是否在所有入口点实施? | 🔴 P0 | ✅ 检查验证中间件 |
| S6 | SQL 注入/XSS/CSRF 防护是否到位? | 🔴 P0 | ✅ 安全扫描工具检测 |
| S7 | 密钥和凭证是否通过安全方式管理(非硬编码)? | 🔴 P0 | ✅ 扫描代码中的密钥 |
| S8 | 网络隔离是否合理(公有/私有子网、安全组)? | 🟡 P1 | ✅ 检查网络配置 |
| S9 | 审计日志是否记录关键操作? | 🟡 P1 | ✅ 检查审计日志配置 |
| S10 | 合规要求(GDPR/SOC 2/HIPAA)是否满足? | 🔴 P0 | 🔶 可检查部分合规项 |
2.7 AI 自动化架构审查 Prompt 模板
一键执行全维度架构审查:
你是一位拥有 15 年经验的软件架构师,擅长架构审查和质量评估。
请对以下系统进行全面的架构审查。
## 系统信息
- 系统名称:[名称]
- 技术栈:[语言/框架/数据库/云平台]
- 团队规模:[人数]
- 预期规模:[用户量/数据量/QPS]
## 架构描述
[粘贴架构文档、C4 图、或目录结构]
## 审查要求
请按以下六大维度进行审查,每个维度给出 1-5 分评分:
### 1. 功能完整性(所有功能是否有组件承载?)
### 2. 非功能需求(性能/可用性/扩展性保障?)
### 3. 可维护性(模块边界/耦合度/扩展性?)
### 4. 运维就绪(监控/部署/恢复方案?)
### 5. 成本效益(是否过度设计?成本可控?)
### 6. 安全性(认证/授权/加密/合规?)
## 输出格式
1. **评分卡**:六维度雷达图数据(每个维度 1-5 分)
2. **发现清单**:按优先级(P0/P1/P2)列出所有发现
3. **Top 5 改进建议**:最重要的 5 个改进建议
4. **反模式检测**:识别到的架构反模式
5. **架构漂移风险**:当前架构与设计意图的偏差3. 架构反模式目录
架构反模式是在实践中反复出现的、看似合理但实际有害的架构决策模式。AI 辅助开发时代,某些反模式变得更加常见——AI 倾向于推荐”教科书式”的复杂方案,而忽略项目的实际约束。以下目录覆盖 12 个最常见的架构反模式,每个反模式包含描述、症状、根因、解决方案和 AI 审查 Prompt。
3.1 反模式 1:过度工程(Over-engineering)
别名:镀金(Gold Plating)、宇航员架构(Architecture Astronaut)
描述:为当前不需要的需求设计过于复杂的架构方案。典型表现是 3 人团队使用微服务 + Kafka + Redis + Elasticsearch + Kubernetes 的”全家桶”架构来构建一个 MVP 产品。
症状:
- 架构图中的组件数量远超团队人数的 2 倍
- 存在大量”以防万一”的抽象层和中间件
- 开发速度明显低于预期,大量时间花在基础设施搭建上
- 团队成员无法完整理解整个系统架构
- 运维复杂度远超业务复杂度
根因:
- AI 倾向于推荐”最佳实践”的复杂方案,忽略项目规模
- 架构师追求技术完美而非业务价值
- 对未来需求的过度预测(YAGNI 违反)
- 简历驱动开发(Resume-Driven Development)
解决方案:
- 遵循 YAGNI 原则:只为当前确定的需求设计
- 使用”最简可行架构”(Minimum Viable Architecture)起步
- 在 Prompt 中明确约束:“我们是 [N] 人团队,请推荐最简可行的架构”
- 设定架构复杂度预算:组件数 ≤ 团队人数 × 2
AI 审查 Prompt:
请评估以下架构方案是否存在过度工程:
## 项目约束
- 团队规模:[人数]
- 预期 DAU:[数量]
- 上线时间:[月数]
## 架构方案
[粘贴架构描述]
请检查:
1. 组件数量是否与团队规模匹配?
2. 是否有当前不需要的中间件或服务?
3. 哪些组件可以合并或移除而不影响 MVP 功能?
4. 如果简化为最简架构,会失去什么?这些是否是当前必需的?3.2 反模式 2:忽视运维成本(Ignoring Operational Costs)
别名:Day 2 盲区、只管建不管养
描述:架构设计只考虑”如何构建”(Day 1),忽略”如何运维”(Day 2)——监控、告警、日志、故障排查、备份恢复、安全更新等持续运营成本。AI 生成的架构方案尤其容易犯这个错误,因为训练数据中的架构文档通常只描述系统设计,很少涉及运维细节。
症状:
- 架构文档中没有监控和告警章节
- 没有定义 SLA/SLO/SLI 指标
- 故障发生时无法快速定位问题(缺少链路追踪)
- 部署需要手动操作,没有自动化流程
- 数据备份策略不明确或未经测试
- 日志格式不统一,无法有效搜索
根因:
- AI 训练数据偏向”设计”而非”运维”
- 开发团队缺乏运维经验
- 项目时间压力下优先交付功能
- “先上线再说”的心态
解决方案:
- 在架构设计 Prompt 中强制包含运维维度
- 使用”Day 2 清单”作为架构审查的必检项
- 将运维需求纳入 Spec 的验收标准
- 采用 Steering 规则强制运维就绪检查
AI 审查 Prompt:
请评估以下架构方案的运维就绪度:
## 架构方案
[粘贴架构描述]
请检查以下 Day 2 运维能力:
1. **可观测性**:是否有指标收集、日志聚合、链路追踪?
2. **告警**:是否定义了关键告警规则和升级路径?
3. **部署**:是否支持零停机部署和快速回滚?
4. **恢复**:RTO/RPO 是否明确?备份是否经过恢复测试?
5. **安全更新**:依赖漏洞修复流程是否明确?
6. **容量规划**:是否有自动扩缩容策略?
7. **成本监控**:是否有基础设施成本告警?
对每项给出"就绪/部分就绪/未就绪"评估,并提供改进建议。3.3 反模式 3:技术偏见(Technology Bias)
别名:锤子效应(Golden Hammer)、简历驱动开发
描述:基于团队或 AI 的技术偏好而非项目需求选择技术栈。AI 的训练数据偏向热门技术(React、Node.js、PostgreSQL、Kubernetes),可能忽略更适合特定场景的小众但成熟的技术方案。
症状:
- 技术选型没有经过系统化的权衡分析
- 选择的技术与项目需求不匹配(如用 MongoDB 存储强关系数据)
- 团队对选择的技术缺乏经验,学习曲线陡峭
- AI 推荐的技术栈总是相同的”热门组合”
- 忽略了更简单、更成熟的替代方案
根因:
- AI 训练数据中热门技术的出现频率远高于小众技术
- 开发者倾向于使用自己熟悉的技术
- 技术社区的”炒作周期”影响决策
- 缺乏系统化的技术评估框架
解决方案:
- 使用多维度权衡矩阵进行技术选型(详见 30b)
- 在 Prompt 中要求 AI 提供”非主流但可能更适合”的替代方案
- 将”团队适配度”作为技术选型的高权重维度
- 对关键技术选型进行 PoC 验证
AI 审查 Prompt:
请审查以下技术选型是否存在技术偏见:
## 项目需求
[描述项目核心需求和约束]
## 当前技术选型
[列出选择的技术栈]
请检查:
1. 每个技术选择是否有明确的需求驱动?
2. 是否考虑过更简单/更成熟的替代方案?
3. 团队对选择的技术是否有足够经验?
4. 是否存在"用大炮打蚊子"的情况?
5. 请推荐至少 1 个可能更适合但不太热门的替代方案。3.4 反模式 4:过早优化(Premature Optimization)
别名:万恶之源(Root of All Evil)
描述:在没有性能数据支撑的情况下,过早引入复杂的优化机制。典型表现是在 MVP 阶段就引入多级缓存、CQRS、事件溯源、读写分离等高级模式,而实际用户量只有几百人。正如 Donald Knuth 所说:“过早优化是万恶之源。”
症状:
- 系统中存在复杂的缓存层,但缓存命中率数据未知
- 使用了 CQRS 或事件溯源,但读写比例未经测量
- 数据库做了读写分离,但写入量远未达到单库瓶颈
- 代码中有大量”性能优化”注释,但没有基准测试数据
- 引入了消息队列处理”高并发”,但实际 QPS 只有个位数
根因:
- AI 倾向于推荐”生产级”的优化方案,不考虑当前规模
- 对性能问题的恐惧驱动(“万一流量暴增怎么办”)
- 缺乏”先测量再优化”的工程文化
- 混淆了”可扩展的架构”和”已优化的架构”
解决方案:
- 遵循”先让它工作,再让它正确,最后让它快”的原则
- 在 Prompt 中明确当前规模:“当前 DAU 只有 [N],请不要引入不必要的优化”
- 设定优化触发条件:只有当性能指标超过阈值时才引入优化
- 使用架构演进路线图替代一步到位的优化
AI 审查 Prompt:
请评估以下架构方案是否存在过早优化:
## 当前规模
- DAU:[数量]
- 峰值 QPS:[数量]
- 数据量:[大小]
## 架构方案
[粘贴架构描述]
请检查:
1. 哪些组件/模式在当前规模下是不必要的?
2. 缓存层是否有实际的性能需求支撑?
3. 消息队列是否有实际的异步处理需求?
4. 读写分离/分库分表是否有数据量支撑?
5. 建议移除哪些优化,改为在什么条件下再引入?3.5 反模式 5:缺少故障模式分析(Missing Failure Mode Analysis)
别名:晴天架构(Fair-Weather Architecture)、只考虑正常路径
描述:架构设计只考虑”一切正常”的场景,缺少对网络分区、服务降级、数据不一致、级联故障等异常场景的设计。AI 生成的架构方案通常只描述”正常路径”(Happy Path),很少主动考虑故障场景。
症状:
- 架构文档中没有故障场景分析章节
- 没有定义服务降级策略(Graceful Degradation)
- 没有熔断器(Circuit Breaker)配置
- 分布式事务没有补偿机制(Saga/补偿事务)
- 没有考虑网络超时和重试策略
- 没有混沌工程或故障注入测试
根因:
- AI 训练数据中的架构文档偏向”设计”而非”故障处理”
- 开发者倾向于先实现功能,后处理异常
- 故障场景需要丰富的生产经验才能预见
- “不会出问题”的乐观偏见
解决方案:
- 在架构设计阶段强制进行故障模式与影响分析(FMEA)
- 使用”如果 X 挂了会怎样”的思维实验审查每个组件
- 在 Prompt 中要求 AI 分析故障场景
- 引入混沌工程实践验证故障恢复能力
AI 审查 Prompt:
请对以下架构方案进行故障模式分析(FMEA):
## 架构方案
[粘贴架构描述]
对每个关键组件,请分析:
| 组件 | 故障模式 | 影响范围 | 检测方式 | 恢复策略 | 降级方案 |
|------|---------|---------|---------|---------|---------|
特别关注:
1. 数据库不可用时,系统如何响应?
2. 第三方 API 超时时,用户体验如何?
3. 消息队列积压时,如何处理?
4. 缓存失效时,是否会导致数据库雪崩?
5. 网络分区时,数据一致性如何保证?
6. 单个服务 OOM 时,是否会级联影响其他服务?3.6 反模式 6:迁移复杂度低估(Underestimating Migration Complexity)
别名:大爆炸迁移(Big Bang Migration)、低估遗留系统
描述:在推荐架构演进方案时,严重低估从现有架构迁移到目标架构的实际复杂度和风险。AI 特别容易犯这个错误——它可以轻松描述”目标架构”的美好蓝图,但对迁移过程中的数据迁移、双写一致性、流量切换、回滚方案等细节缺乏深入分析。
症状:
- 迁移计划只有”目标状态”,没有”过渡状态”
- 没有数据迁移方案或数据迁移方案过于简化
- 没有考虑迁移期间的双写/双读一致性问题
- 迁移时间估算过于乐观(实际通常是估算的 3-5 倍)
- 没有回滚方案或回滚方案不可行
- 忽略了迁移对现有用户的影响
根因:
- AI 缺乏实际迁移经验,倾向于描述理想状态
- 低估了遗留系统的复杂度和隐含业务规则
- 忽略了”Strangler Fig”等渐进式迁移模式的实施细节
- 对数据迁移的复杂度认识不足
解决方案:
- 要求 AI 提供分阶段的迁移计划(而非一步到位)
- 每个迁移阶段必须包含回滚方案
- 数据迁移必须有验证步骤和一致性检查
- 使用 Strangler Fig 模式进行渐进式迁移
- 迁移时间估算乘以 3 作为安全系数
AI 审查 Prompt:
请评估以下架构迁移方案的可行性:
## 当前架构
[描述现有架构]
## 目标架构
[描述目标架构]
## 迁移计划
[粘贴迁移计划]
请检查:
1. 迁移是否分阶段?每个阶段是否可独立回滚?
2. 数据迁移方案是否完整?是否有一致性验证?
3. 迁移期间的双写/双读策略是否明确?
4. 流量切换策略是否支持渐进式(灰度)?
5. 迁移时间估算是否合理?(通常需要乘以 3-5 倍安全系数)
6. 对现有用户的影响是否评估?是否有沟通计划?
7. 最坏情况下的回滚方案是什么?回滚需要多长时间?3.7 反模式 7:大泥球(Big Ball of Mud)
别名:意大利面架构(Spaghetti Architecture)
描述:系统缺乏清晰的架构边界,组件之间随意依赖,代码结构混乱。在 AI 辅助开发中,如果没有 Steering 规则约束,AI 生成的代码可能逐渐侵蚀模块边界,导致系统退化为大泥球。
症状:
- 任何修改都可能影响系统的多个不相关部分
- 无法独立测试单个模块
- 新成员需要数周才能理解系统结构
- 依赖关系图呈现”网状”而非”分层”结构
- 存在大量循环依赖
根因:
- 缺乏架构约束和边界定义
- AI 生成代码时倾向于”最短路径”实现,忽略模块边界
- 没有架构测试(如 ArchUnit)防止边界侵蚀
- 技术债务长期积累未清理
解决方案:
- 定义明确的模块边界和依赖规则
- 使用 Steering 规则约束 AI 遵守模块边界
- 引入架构测试(ArchUnit / Dependency Cruiser)自动检测违规
- 定期进行架构审查,及时修复边界侵蚀
3.8 反模式 8:分布式单体(Distributed Monolith)
别名:微服务地狱、最差的两个世界
描述:名义上是微服务架构,但服务之间高度耦合,必须同时部署、同时发布,失去了微服务的独立性优势,同时承受了分布式系统的所有复杂性(网络延迟、数据一致性、运维复杂度)。
症状:
- 修改一个服务需要同时修改和部署其他服务
- 服务之间共享数据库
- 服务之间存在同步调用链超过 3 层
- 无法独立扩展单个服务
- 一个服务故障导致整个系统不可用
根因:
- 服务边界划分不当(按技术层而非业务领域划分)
- AI 生成的微服务方案缺乏 DDD 领域分析
- 为了”微服务”而微服务,没有真正的独立性需求
- 缺乏服务间契约测试
解决方案:
- 使用 DDD 限界上下文划分服务边界
- 确保每个服务拥有自己的数据存储
- 同步调用链不超过 3 层,优先使用异步通信
- 引入契约测试(Pact / Spring Cloud Contract)验证服务独立性
- 如果服务总是一起部署,考虑合并为模块化单体
3.9 反模式 9:供应商锁定(Vendor Lock-in)
别名:云平台绑架、单一供应商依赖
描述:架构深度依赖特定云平台或供应商的专有服务,导致迁移成本极高。AI 推荐的架构方案常常大量使用云平台专有服务(如 AWS Lambda + DynamoDB + SQS + API Gateway),虽然开发效率高,但迁移到其他平台几乎需要重写。
症状:
- 核心业务逻辑直接调用云平台专有 API
- 没有抽象层隔离云平台依赖
- 无法在本地环境完整运行系统
- 云平台价格调整直接影响项目可行性
- 无法评估迁移到其他平台的成本
根因:
- AI 倾向于推荐云平台的”全托管”方案(开发最快)
- 短期效率优先于长期灵活性
- 缺乏对供应商锁定风险的评估
解决方案:
- 核心业务逻辑与云平台服务之间使用适配器模式隔离
- 评估每个云平台专有服务的”锁定程度”和”替代方案”
- 对高锁定风险的服务,保留开源替代方案的可行性
- 在 Prompt 中要求 AI 评估供应商锁定风险
3.10 反模式 10:缺少 API 版本管理(Missing API Versioning)
别名:破坏性变更、API 地狱
描述:API 设计没有版本管理策略,任何 API 变更都可能破坏现有客户端。在 AI 辅助开发中,AI 生成的 API 通常不会主动考虑版本管理,导致后期维护困难。
症状:
- API URL 中没有版本号(如
/api/users而非/api/v1/users) - 没有 API 变更日志(Changelog)
- 客户端频繁因 API 变更而崩溃
- 无法同时支持新旧版本的客户端
- API 文档与实际行为不一致
根因:
- AI 生成 API 时默认不考虑版本管理
- MVP 阶段忽略了 API 契约的重要性
- 缺乏 API 设计规范和审查流程
解决方案:
- 从第一个 API 开始就使用版本号(URL 路径或 Header)
- 定义 API 变更策略(向后兼容/废弃周期/迁移指南)
- 使用 OpenAPI/Swagger 规范定义 API 契约
- 引入 API 契约测试防止破坏性变更
- 在 Steering 规则中强制 API 版本管理
3.11 反模式 11:日志黑洞(Logging Black Hole)
别名:不可观测系统、盲飞架构
描述:系统缺乏有效的可观测性设计——日志格式不统一、缺少结构化日志、没有链路追踪、没有业务指标监控。当生产环境出现问题时,无法快速定位根因。
症状:
- 日志格式不统一(有的 JSON、有的纯文本、有的无时间戳)
- 无法通过请求 ID 追踪一个请求的完整链路
- 生产环境问题需要数小时才能定位
- 没有业务指标仪表板(如订单量、支付成功率)
- 日志量过大但有效信息过少
根因:
- AI 生成代码时通常只添加基本的
console.log - 可观测性被视为”运维问题”而非”架构问题”
- 缺乏统一的日志和监控标准
解决方案:
- 在架构设计阶段定义可观测性标准(日志格式、指标命名、追踪规范)
- 使用结构化日志(JSON 格式)并包含请求 ID、用户 ID、操作类型
- 引入分布式链路追踪(OpenTelemetry)
- 定义关键业务指标(KPI)并建立仪表板
- 在 Steering 规则中强制日志和监控标准
3.12 反模式 12:配置硬编码(Hardcoded Configuration)
别名:环境耦合、配置地狱
描述:将环境相关的配置(数据库连接串、API 密钥、功能开关、超时时间)硬编码在代码中,导致不同环境需要修改代码才能部署。AI 生成的代码示例中经常包含硬编码的配置值。
症状:
- 代码中存在硬编码的 URL、端口、密钥
- 切换环境(开发/测试/生产)需要修改代码
- 功能开关需要重新部署才能生效
- 密钥泄露风险高(密钥在代码仓库中)
- 无法进行 A/B 测试或灰度发布
根因:
- AI 生成的代码示例通常使用硬编码值作为演示
- 开发者直接复制 AI 生成的示例代码到生产环境
- 缺乏配置管理规范
解决方案:
- 遵循 12-Factor App 的配置原则:通过环境变量注入配置
- 使用配置管理服务(AWS Parameter Store / HashiCorp Vault / Doppler)
- 在 Steering 规则中禁止硬编码配置值
- AI 生成代码时要求使用环境变量占位符
3.13 反模式总览表
| # | 反模式 | 严重度 | AI 易犯度 | 检测难度 | 修复成本 |
|---|---|---|---|---|---|
| 1 | 过度工程 | 🔴 高 | 🔴 高 | 🟡 中 | 🟡 中 |
| 2 | 忽视运维成本 | 🔴 高 | 🔴 高 | 🟡 中 | 🔴 高 |
| 3 | 技术偏见 | 🟡 中 | 🔴 高 | 🔴 高 | 🟡 中 |
| 4 | 过早优化 | 🟡 中 | 🔴 高 | 🟡 中 | 🟡 中 |
| 5 | 缺少故障模式分析 | 🔴 高 | 🔴 高 | 🟡 中 | 🔴 高 |
| 6 | 迁移复杂度低估 | 🔴 高 | 🔴 高 | 🔴 高 | 🔴 高 |
| 7 | 大泥球 | 🔴 高 | 🟡 中 | 🟢 低 | 🔴 高 |
| 8 | 分布式单体 | 🔴 高 | 🟡 中 | 🟡 中 | 🔴 高 |
| 9 | 供应商锁定 | 🟡 中 | 🟡 中 | 🟡 中 | 🔴 高 |
| 10 | 缺少 API 版本管理 | 🟡 中 | 🔴 高 | 🟢 低 | 🟡 中 |
| 11 | 日志黑洞 | 🟡 中 | 🔴 高 | 🟢 低 | 🟡 中 |
| 12 | 配置硬编码 | 🟡 中 | 🔴 高 | 🟢 低 | 🟢 低 |
4. AI 驱动的架构健康度评估
4.1 架构健康度指标体系
架构健康度是对系统架构质量的综合量化评估。AI 可以通过分析代码库自动计算大部分指标,为架构审查提供数据支撑。
| 指标类别 | 具体指标 | 计算方式 | 健康阈值 | 工具支持 |
|---|---|---|---|---|
| 耦合度 | 模块间依赖数(Afferent/Efferent Coupling) | 统计模块间的 import/依赖关系 | 传入依赖 ≤ 10,传出依赖 ≤ 8 | SonarQube、Dependency Cruiser |
| 内聚度 | 模块内聚度(LCOM4) | 分析模块内部类/函数的关联性 | LCOM4 ≤ 2 | CodeScene、SonarQube |
| 复杂度 | 圈复杂度(Cyclomatic Complexity) | 分析代码路径分支数 | 函数级 ≤ 10,模块级 ≤ 50 | ESLint、SonarQube |
| 模块大小 | 代码行数 / 文件数 | 统计每个模块的规模 | 单模块 ≤ 5000 行 | cloc、tokei |
| 依赖深度 | 最长依赖链长度 | 分析依赖图的最长路径 | ≤ 5 层 | Dependency Cruiser |
| 循环依赖 | 循环依赖数量 | 检测依赖图中的环 | 0 个 | SonarQube Architecture、Dependency Cruiser |
| API 一致性 | API 命名/参数/响应格式一致性 | 分析 API 定义的规范符合度 | ≥ 90% 一致 | Spectral、Claude Code |
| 测试覆盖 | 架构关键路径测试覆盖率 | 分析核心模块的测试覆盖 | ≥ 80% | Jest、Vitest、Istanbul |
| 技术债务 | 债务比率(Debt Ratio) | 修复所有问题的估算时间 / 重写时间 | ≤ 5% | SonarQube |
| 架构漂移 | 实际依赖 vs 设计依赖的差异数 | 对比架构图与实际代码依赖 | 0 个偏差 | SonarQube Architecture、ArchUnit |
4.2 架构健康度评估 Prompt 模板
全面架构健康度评估:
你是一位架构健康度评估专家。请对以下代码仓库进行架构健康度评估。
## 仓库信息
- 语言:[TypeScript/Python/Go/Java]
- 框架:[框架名称]
- 目录结构:
[粘贴 tree 命令输出]
## 评估维度(每个维度 1-5 分)
### 1. 模块化程度
- 模块边界是否清晰?
- 模块间耦合度是否可接受?
- 是否存在"上帝模块"?
### 2. 依赖健康度
- 是否存在循环依赖?
- 依赖方向是否正确(高层不依赖低层实现)?
- 外部依赖是否通过适配器隔离?
### 3. 代码组织
- 目录结构是否反映架构意图?
- 命名是否一致且有意义?
- 关注点分离是否到位?
### 4. 可测试性
- 核心逻辑是否可以独立测试?
- 依赖注入是否广泛使用?
- 测试覆盖率是否充足?
### 5. 可扩展性
- 新功能添加是否需要修改核心代码?
- 是否有明确的扩展点?
- 配置是否外部化?
### 6. 运维就绪度
- 日志是否结构化?
- 健康检查是否实现?
- 错误处理是否一致?
## 输出格式
1. **健康度评分卡**(六维度雷达图数据)
2. **Top 5 架构风险**(按严重度排序)
3. **改进路线图**(短期/中期/长期)
4. **Steering 规则建议**(防止进一步退化)4.3 架构健康度趋势监控
架构健康度不是一次性评估,而是需要持续监控的指标。以下是建立架构健康度趋势监控的方法:
CI/CD 集成架构健康度检查:
# .github/workflows/architecture-health.yml
name: Architecture Health Check
on:
push:
branches: [main]
schedule:
- cron: '0 9 * * 1' # 每周一早上 9 点
jobs:
health-check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: 检查循环依赖
run: |
npx dependency-cruiser --config .dependency-cruiser.cjs src/ \
--output-type err
- name: 检查模块边界
run: |
npx dependency-cruiser --config .dependency-cruiser.cjs src/ \
--output-type archi \
--output-to reports/dependency-graph.svg
- name: 计算复杂度指标
run: |
npx eslint src/ --format json --output-file reports/complexity.json \
--rule '{"complexity": ["warn", 10]}'
- name: 生成架构健康度报告
run: |
echo "## 架构健康度报告 $(date)" > reports/health-report.md
echo "" >> reports/health-report.md
echo "### 循环依赖" >> reports/health-report.md
npx dependency-cruiser --config .dependency-cruiser.cjs src/ \
--output-type text >> reports/health-report.md || true
echo "" >> reports/health-report.md
echo "### 复杂度警告" >> reports/health-report.md
cat reports/complexity.json | jq '.[] | .messages[] | .message' \
>> reports/health-report.md || true
- name: 上传报告
uses: actions/upload-artifact@v4
with:
name: architecture-health-report
path: reports/5. 架构漂移检测方法
5.1 什么是架构漂移
架构漂移(Architecture Drift)是指实际代码实现逐渐偏离设计时的架构意图。在 AI 辅助开发中,架构漂移的风险更高——AI 生成的代码可能不了解团队的架构约定,逐渐侵蚀模块边界。
架构漂移的常见表现:
| 漂移类型 | 描述 | 示例 |
|---|---|---|
| 依赖漂移 | 模块间出现了设计中不存在的依赖 | 表现层直接访问数据库,绕过业务层 |
| 边界漂移 | 模块边界被突破,内部实现被外部直接访问 | 其他模块直接 import 某模块的内部工具函数 |
| 职责漂移 | 组件承担了设计中未分配的职责 | API 网关中包含了业务逻辑 |
| 通信漂移 | 组件间通信方式偏离设计 | 设计为异步事件驱动,实际用了同步 HTTP 调用 |
| 数据漂移 | 数据所有权或访问模式偏离设计 | 多个服务直接访问同一个数据库表 |
5.2 AI 驱动的架构漂移检测
检测工作流:
┌─────────────────────────────────────────────────────────┐
│ AI 驱动的架构漂移检测工作流 │
├─────────────────────────────────────────────────────────┤
│ │
│ ① 架构基线定义 ② 实际架构提取 │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 设计文档 │ │ 代码依赖分析 │ │
│ │ C4 模型 │ │ import 图谱 │ │
│ │ ADR 记录 │ │ API 调用链 │ │
│ │ Steering 规则│ │ 数据访问模式 │ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ └───────┬───────────┘ │
│ ▼ │
│ ③ AI 对比分析 │
│ ┌──────────────────────────────────┐ │
│ │ · 设计依赖 vs 实际依赖 │ │
│ │ · 模块边界是否被突破 │ │
│ │ · API 契约是否变更 │ │
│ │ · 新增组件是否符合架构模式 │ │
│ └──────────────┬───────────────────┘ │
│ ▼ │
│ ④ 漂移报告 │
│ ┌──────────────────────────────────┐ │
│ │ · 漂移清单(按严重度排序) │ │
│ │ · 每个漂移的影响分析 │ │
│ │ · 修复建议和优先级 │ │
│ │ · Steering 规则更新建议 │ │
│ └──────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────┘架构漂移检测 Prompt 模板:
请对比以下架构设计文档和实际代码结构,检测架构漂移:
## 设计文档中的架构意图
[粘贴架构设计文档或 C4 图]
## 实际代码结构
[粘贴 tree 命令输出或依赖分析结果]
## Steering 规则(架构约束)
[粘贴 Steering 规则]
请检测以下类型的漂移:
1. **依赖漂移**:是否存在设计中不允许的模块间依赖?
2. **边界漂移**:是否有模块的内部实现被外部直接访问?
3. **职责漂移**:是否有组件承担了设计中未分配的职责?
4. **通信漂移**:组件间通信方式是否偏离设计?
5. **命名漂移**:代码中的命名是否与架构文档一致?
## 输出格式
| 漂移类型 | 位置 | 设计意图 | 实际情况 | 严重度 | 修复建议 |
|---------|------|---------|---------|--------|---------|5.3 SonarQube Architecture 架构漂移检测
2025 年底,Sonar 发布了 Architecture 功能(Beta),支持定义意图架构并自动检测实际代码与意图架构的偏差。这是目前最成熟的自动化架构漂移检测方案。
SonarQube Architecture 配置示例(YAML):
# sonar-architecture.yaml
# 定义意图架构:分层架构 + 模块边界
perspectives:
- name: "分层架构"
groups:
- name: "表现层"
includes:
- "src/controllers/**"
- "src/routes/**"
- "src/middleware/**"
- name: "业务层"
includes:
- "src/services/**"
- "src/domain/**"
- name: "数据层"
includes:
- "src/repositories/**"
- "src/models/**"
- name: "基础设施层"
includes:
- "src/infrastructure/**"
- "src/config/**"
constraints:
# 表现层只能依赖业务层
- from: "表现层"
allow:
- "业务层"
deny:
- "数据层" # 禁止表现层直接访问数据层
- "基础设施层" # 禁止表现层直接访问基础设施层
# 业务层可以依赖数据层,但不能依赖表现层
- from: "业务层"
allow:
- "数据层"
deny:
- "表现层" # 禁止业务层依赖表现层(反向依赖)
# 数据层不能依赖业务层和表现层
- from: "数据层"
deny:
- "业务层"
- "表现层"5.4 Dependency Cruiser 架构规则配置
对于 JavaScript/TypeScript 项目,Dependency Cruiser 是最流行的依赖分析和架构规则工具:
// .dependency-cruiser.cjs
/** @type {import('dependency-cruiser').IConfiguration} */
module.exports = {
forbidden: [
// 禁止循环依赖
{
name: 'no-circular',
severity: 'error',
comment: '禁止循环依赖,这会导致模块边界模糊',
from: {},
to: { circular: true }
},
// 禁止表现层直接访问数据层
{
name: 'no-controller-to-repository',
severity: 'error',
comment: '控制器不能直接访问 Repository,必须通过 Service 层',
from: { path: '^src/controllers/' },
to: { path: '^src/repositories/' }
},
// 禁止业务层依赖表现层
{
name: 'no-service-to-controller',
severity: 'error',
comment: '服务层不能依赖控制器层(反向依赖)',
from: { path: '^src/services/' },
to: { path: '^src/controllers/' }
},
// 禁止跨模块直接访问内部实现
{
name: 'no-cross-module-internals',
severity: 'warn',
comment: '模块间只能通过公共接口(index.ts)通信',
from: { path: '^src/modules/([^/]+)/' },
to: {
path: '^src/modules/([^/]+)/',
pathNot: [
'^src/modules/$1/', // 同模块内部允许
'^src/modules/[^/]+/index\\.ts$' // 其他模块的公共接口允许
]
}
}
],
options: {
doNotFollow: {
path: 'node_modules'
},
tsPreCompilationDeps: true,
tsConfig: { fileName: 'tsconfig.json' }
}
};6. 架构审查 Prompt 模板库
6.1 PR 级架构审查 Prompt
在每个 Pull Request 中执行轻量级架构审查,防止架构漂移在代码合并时发生:
请对以下 PR 进行架构级审查(不是代码风格审查):
## PR 变更摘要
[粘贴 PR 描述或 git diff --stat 输出]
## 架构约束(Steering 规则)
[粘贴项目的架构 Steering 规则]
请检查以下架构关注点:
### 1. 模块边界
- 变更是否跨越了模块边界?
- 是否引入了新的跨模块依赖?
- 新依赖是否符合架构约束?
### 2. 分层合规
- 是否存在跨层直接调用(如控制器直接访问数据库)?
- 依赖方向是否正确?
### 3. API 契约
- 是否修改了公共 API?是否向后兼容?
- 新 API 是否遵循项目的 API 设计规范?
### 4. 数据模型
- 是否修改了数据库 Schema?是否有迁移文件?
- 数据模型变更是否影响其他模块?
### 5. 安全性
- 是否引入了新的外部依赖?是否有已知漏洞?
- 是否有硬编码的密钥或配置?
## 输出格式
- 🔴 阻断性问题(必须修复才能合并)
- 🟡 建议改进(建议修复但不阻断)
- 🟢 信息提示(供参考)6.2 季度架构审查 Prompt
每季度进行一次全面的架构健康度审查,评估架构演进方向:
请进行本季度的架构健康度审查。
## 项目信息
- 项目名称:[名称]
- 上次审查日期:[日期]
- 本季度主要变更:[列出重大功能/架构变更]
## 审查范围
[粘贴当前代码库结构或架构图]
## 上次审查的遗留问题
[列出上次审查发现但未修复的问题]
## 请执行以下审查:
### 1. 架构漂移评估
- 当前代码结构是否仍然符合设计文档?
- 是否有新的模块边界违规?
- ADR 中的决策是否仍然有效?
### 2. 技术债务盘点
- 新增了哪些技术债务?
- 上次识别的技术债务是否有改善?
- 技术债务的"利息"是否在增长?
### 3. 架构演进评估
- 当前架构是否仍然满足业务需求?
- 是否需要进行架构演进?触发条件是什么?
- 下一步架构改进的优先级建议
### 4. 安全态势评估
- 是否有新的安全风险?
- 依赖漏洞是否及时修复?
- 安全架构是否需要更新?
## 输出格式
1. **健康度评分卡**(与上次对比)
2. **新发现问题清单**(按优先级排序)
3. **遗留问题进展**
4. **下季度改进建议**(Top 3)
5. **Steering 规则更新建议**6.3 反模式检测 Prompt
专门用于检测架构反模式的深度分析 Prompt:
请对以下系统进行架构反模式检测。
## 系统信息
- 技术栈:[语言/框架/数据库]
- 团队规模:[人数]
- 系统年龄:[月/年]
- 当前规模:[用户量/数据量]
## 代码结构
[粘贴目录结构或依赖分析结果]
## 架构描述
[粘贴架构文档或 C4 图]
请检测以下 12 个架构反模式:
1. **过度工程**:组件数量是否与需求规模匹配?
2. **忽视运维成本**:可观测性和运维自动化是否就绪?
3. **技术偏见**:技术选型是否有需求驱动?
4. **过早优化**:是否有当前规模不需要的优化机制?
5. **缺少故障模式分析**:故障场景是否有设计?
6. **迁移复杂度低估**:架构演进计划是否可行?
7. **大泥球**:模块边界是否清晰?依赖是否有序?
8. **分布式单体**:微服务是否真正独立?
9. **供应商锁定**:核心逻辑是否与云平台解耦?
10. **缺少 API 版本管理**:API 是否有版本策略?
11. **日志黑洞**:日志和监控是否有效?
12. **配置硬编码**:配置是否外部化?
## 输出格式
对每个反模式:
- **检测结果**:存在 / 不存在 / 有风险
- **证据**:具体的代码位置或架构特征
- **严重度**:🔴 高 / 🟡 中 / 🟢 低
- **修复建议**:具体的改进措施
- **修复优先级**:P0 / P1 / P26.4 新项目架构审查 Prompt
在新项目启动时,对初始架构方案进行审查:
请对以下新项目的架构方案进行启动前审查。
## 项目背景
- 项目类型:[SaaS/电商/内部工具/API 平台]
- 团队规模:[人数]
- 上线时间:[截止日期]
- 预期规模:[用户量/数据量]
- 预算:[月度基础设施预算]
## 架构方案
[粘贴架构设计文档]
## 审查重点
### 1. 方案合理性
- 架构复杂度是否与项目规模匹配?
- 技术选型是否与团队能力匹配?
- 是否遵循了"最简可行架构"原则?
### 2. 风险识别
- Top 5 架构风险是什么?
- 每个风险的缓解措施是否充分?
- 是否有"致命假设"需要尽早验证?
### 3. 演进可行性
- 从 MVP 到成熟期的演进路径是否清晰?
- 演进过程中的关键决策点是什么?
- 是否为未来的架构变更预留了接缝?
### 4. 遗漏检查
- 是否遗漏了关键的非功能需求?
- 安全设计是否完整?
- 运维就绪度是否考虑?
## 输出格式
1. **总体评价**:通过 / 有条件通过 / 需要重大修改
2. **必须修改项**(阻断性问题)
3. **建议修改项**(改进建议)
4. **风险登记表**
5. **启动前检查清单**(确认所有前置条件满足)7. Steering 规则模板(防止架构退化)
Steering 规则是 AI 编码助手的行为约束文件,可以有效防止 AI 生成的代码违反架构约束。以下提供多个场景的 Steering 规则模板。
7.1 通用架构约束 Steering 规则
# 架构约束 Steering 规则
## 分层架构约束
- 控制器层(controllers/)只能调用服务层(services/),禁止直接访问数据层
- 服务层(services/)可以调用数据层(repositories/),禁止依赖控制器层
- 数据层(repositories/)不能依赖服务层和控制器层
- 工具函数(utils/)不能依赖任何业务层
## 模块边界约束
- 模块间通过公共接口(index.ts)通信,禁止直接导入其他模块的内部文件
- 每个模块拥有独立的数据模型,禁止跨模块直接查询数据库表
- 新增跨模块依赖必须在 PR 描述中说明理由
## 数据访问约束
- 所有数据库操作必须通过 ORM(Prisma/Drizzle),禁止原始 SQL(除非有性能优化的 ADR 支持)
- 数据库迁移必须可回滚,禁止破坏性变更(如删除列)不提供回滚脚本
- 缓存操作必须通过统一的缓存服务,禁止直接调用 Redis 客户端
## 配置管理约束
- 所有环境相关配置通过环境变量注入,禁止硬编码
- 密钥和凭证必须通过密钥管理服务,禁止出现在代码仓库中
- 功能开关通过配置服务管理,禁止硬编码 if/else 分支
## API 设计约束
- 所有 API 必须包含版本号(/api/v1/...)
- API 响应格式必须统一({ data, error, meta })
- 破坏性 API 变更必须创建新版本,旧版本保留至少 3 个月
## 错误处理约束
- 所有异步操作必须有错误处理(try/catch 或 .catch())
- 错误响应必须包含错误码、错误消息和请求 ID
- 禁止吞掉异常(catch 块中不能为空)
## 日志和监控约束
- 所有 API 请求必须记录结构化日志(JSON 格式)
- 日志必须包含:请求 ID、用户 ID、操作类型、耗时、状态码
- 关键业务操作必须记录审计日志
- 新增服务必须实现 /health 健康检查端点7.2 微服务架构 Steering 规则
# 微服务架构 Steering 规则
## 服务边界
- 每个微服务对应一个限界上下文,不按技术层划分
- 服务数量不超过团队人数的 2 倍
- 如果两个服务总是一起部署,考虑合并为一个服务
## 通信约束
- 同步调用链不超过 3 层
- 跨服务数据查询优先使用 CQRS 读模型,而非级联 API 调用
- 所有异步通信必须设计幂等性和重试策略
- 服务间通信必须有超时配置(默认 5 秒)
- 必须配置熔断器(Circuit Breaker),防止级联故障
## 数据管理
- 每个服务拥有自己的数据库 Schema 或数据库实例
- 禁止跨服务直接访问数据库
- 数据同步使用事件驱动,而非定时批量同步
- 分布式事务使用 Saga 模式,禁止两阶段提交(2PC)
## 部署约束
- 每个服务必须可以独立部署和回滚
- 服务间的 API 变更必须向后兼容
- 新版本部署必须支持金丝雀发布
## 可观测性
- 每个服务必须暴露 Prometheus 指标端点
- 所有跨服务调用必须传播链路追踪上下文(Trace ID)
- 每个服务必须有独立的日志流7.3 模块化单体 Steering 规则
# 模块化单体架构 Steering 规则
## 模块定义
- 每个业务领域对应一个模块目录(src/modules/{module-name}/)
- 模块必须有公共接口文件(index.ts),只导出公共 API
- 模块内部文件不能被其他模块直接导入
## 模块间通信
- 模块间通过公共接口通信,禁止直接访问内部实现
- 模块间数据传递使用 DTO(Data Transfer Object),禁止传递内部实体
- 跨模块事件使用内部事件总线,为未来拆分预留接缝
## 数据隔离
- 每个模块拥有独立的数据库 Schema(schema-per-module)
- 禁止跨模块 JOIN 查询
- 共享数据通过事件同步或 API 调用获取
## 未来拆分预留
- 模块间不共享内存状态
- 模块间通信可以替换为网络调用(接口设计兼容)
- 每个模块的依赖可以独立管理8. 团队架构审查协作模式
8.1 架构审查的角色分工
| 角色 | 职责 | AI 辅助方式 |
|---|---|---|
| 架构负责人 | 定义架构标准、审批重大架构变更、维护 ADR | AI 生成 ADR 草稿、权衡分析报告 |
| 技术 Lead | 日常架构审查、PR 级架构检查、指导团队 | AI 自动 PR 审查、反模式检测 |
| 开发者 | 遵守架构约束、提出架构改进建议 | AI Steering 规则约束、实时架构提示 |
| 运维工程师 | 审查运维就绪度、部署架构、监控策略 | AI 生成运维清单、告警规则建议 |
| 安全工程师 | 审查安全架构、合规性、威胁模型 | AI 安全扫描、合规检查 |
8.2 架构审查的频率和触发条件
| 审查类型 | 频率 | 触发条件 | 参与者 | AI 辅助程度 |
|---|---|---|---|---|
| PR 级审查 | 每个 PR | 代码提交 | 技术 Lead + AI | 🟢 高(自动化) |
| Sprint 审查 | 每 2 周 | Sprint 结束 | 团队 + 架构负责人 | 🟡 中(报告生成) |
| 季度审查 | 每季度 | 季度末 | 全团队 + 管理层 | 🟡 中(健康度评估) |
| 重大变更审查 | 按需 | 新服务/新技术/架构重构 | 架构委员会 | 🟢 高(权衡分析) |
| 事后审查 | 按需 | 生产事故 | 相关团队 | 🟡 中(根因分析) |
8.3 架构审查会议模板
会前准备(AI 辅助生成):
请帮我准备架构审查会议材料:
## 审查范围
- 时间范围:[上次审查日期] 至今
- 主要变更:[列出重大变更]
请生成:
1. **架构变更摘要**(1 页,列出所有架构相关变更)
2. **健康度对比**(与上次审查的指标对比)
3. **新发现问题**(AI 自动检测的架构问题)
4. **讨论议题**(需要团队讨论的架构决策)
5. **决策模板**(会议中需要做的决策的 ADR 模板)会议议程模板:
# 架构审查会议议程
## 基本信息
- 日期:[日期]
- 参与者:[名单]
- 时长:60 分钟
## 议程
### 1. 回顾(10 分钟)
- 上次审查的遗留问题进展
- 本周期的架构变更摘要
### 2. 健康度报告(10 分钟)
- AI 生成的架构健康度评分
- 关键指标趋势(耦合度、复杂度、技术债务)
### 3. 问题讨论(25 分钟)
- AI 检测到的架构问题
- 团队提出的架构关注点
- 需要决策的架构问题
### 4. 决策和行动项(10 分钟)
- 记录架构决策(ADR)
- 分配修复任务和优先级
- 更新 Steering 规则(如需要)
### 5. 下次审查计划(5 分钟)
- 确认下次审查日期
- 确认重点关注领域实战案例:电商平台架构审查全流程
案例背景
一个运行了 8 个月的 B2C 电商平台,团队从 3 人增长到 8 人,用户从 1000 DAU 增长到 2 万 DAU。技术栈为 TypeScript + Next.js + Fastify + PostgreSQL + Redis。团队感觉”代码越来越难改”,决定进行一次全面的架构审查。
步骤 1:AI 自动扫描
使用 Claude Code 执行架构扫描:
请对当前代码仓库进行全面的架构健康度扫描。
重点关注:
1. 模块边界是否清晰?是否有循环依赖?
2. 是否存在"上帝模块"(职责过多的模块)?
3. 数据访问模式是否规范?是否有跨层直接调用?
4. 错误处理是否一致?
5. 日志和监控是否完整?
6. 是否存在硬编码配置?
7. API 设计是否一致?AI 扫描结果摘要:
## 架构健康度评分
| 维度 | 评分 | 说明 |
|------|------|------|
| 模块化程度 | 3/5 | 模块边界基本清晰,但存在 3 处循环依赖 |
| 依赖健康度 | 2/5 | 发现 5 处跨层直接调用,2 个"上帝模块" |
| 代码组织 | 4/5 | 目录结构合理,命名一致 |
| 可测试性 | 3/5 | 核心逻辑可测试,但部分服务缺少依赖注入 |
| 运维就绪度 | 2/5 | 缺少结构化日志,无链路追踪,健康检查不完整 |
| 安全性 | 3/5 | 认证方案合理,但发现 2 处硬编码配置 |
## 发现的反模式
1. 🔴 **大泥球趋势**:order 模块直接导入 user 模块的内部实现
2. 🔴 **日志黑洞**:日志格式不统一,无请求 ID 追踪
3. 🟡 **过早优化**:引入了 Redis 缓存层,但缓存命中率未监控
4. 🟡 **配置硬编码**:2 处第三方 API 密钥硬编码在代码中
5. 🟡 **缺少 API 版本管理**:所有 API 无版本号步骤 2:人工确认和优先级排序
架构师审查 AI 的扫描结果,确认发现的问题并排序:
| 优先级 | 问题 | 修复方案 | 预估工时 |
|---|---|---|---|
| 🔴 P0 | 硬编码密钥 | 迁移到环境变量 + AWS Secrets Manager | 2 小时 |
| 🔴 P0 | 日志黑洞 | 引入 Pino 结构化日志 + 请求 ID 中间件 | 1 天 |
| 🟡 P1 | 模块边界侵蚀 | 重构 order→user 依赖,通过接口通信 | 2 天 |
| 🟡 P1 | API 版本管理 | 添加 /api/v1/ 前缀,定义版本策略 | 1 天 |
| 🟡 P1 | 缓存监控 | 添加缓存命中率指标和 Grafana 仪表板 | 半天 |
| 🟢 P2 | 循环依赖 | 提取共享类型到独立包 | 1 天 |
步骤 3:生成 Steering 规则
基于审查发现,生成防止问题复发的 Steering 规则:
# 电商平台架构 Steering 规则(基于 2025-XX 架构审查)
## 模块边界(修复 P1 模块边界侵蚀)
- order 模块不能直接导入 user 模块的内部文件
- 模块间通信必须通过 modules/{name}/index.ts 公共接口
- 新增跨模块依赖必须在 PR 中说明理由
## 配置管理(修复 P0 硬编码密钥)
- 禁止在代码中硬编码 API 密钥、数据库连接串等敏感信息
- 所有配置通过 src/config/ 统一管理,从环境变量读取
- 新增第三方服务集成必须使用 Secrets Manager
## 日志标准(修复 P0 日志黑洞)
- 所有日志使用 Pino JSON 格式
- 每条日志必须包含:requestId, userId, action, duration
- 新增 API 端点必须有请求/响应日志
## API 规范(修复 P1 API 版本管理)
- 所有 API 路径必须包含版本号:/api/v1/...
- API 响应格式:{ data, error, pagination }
- 破坏性变更必须创建新版本案例分析
关键收获:
- AI 扫描效率高:AI 在数分钟内完成了人工需要数天的架构扫描,覆盖了模块依赖、代码组织、安全配置等多个维度
- 人工确认不可少:AI 发现的”过早优化”(Redis 缓存)经人工确认后,认为缓存本身是合理的,只是缺少监控——AI 的判断需要业务上下文校准
- Steering 规则是关键:审查发现的问题如果没有转化为 Steering 规则,很可能在下次开发中再次出现
- 定期审查形成闭环:将架构审查纳入 Sprint 流程,每 2 周检查一次 Steering 规则的执行情况
避坑指南
❌ 常见错误
-
只做一次架构审查就”完事了”
- 问题:架构审查是一次性活动,审查后没有持续监控,架构问题很快复发
- 正确做法:将架构审查纳入 CI/CD 流程,PR 级自动检查 + 季度全面审查形成闭环
-
完全依赖 AI 的审查结果
- 问题:AI 可能产生误报(将合理的设计判断为反模式)或漏报(无法理解业务上下文)
- 正确做法:AI 审查结果作为”初筛”,架构师进行人工确认和优先级排序
-
审查清单过于庞大导致”审查疲劳”
- 问题:50+ 项的审查清单让团队望而却步,最终流于形式
- 正确做法:根据项目阶段和风险级别,选择最相关的 10-15 项重点检查
-
发现问题但不修复
- 问题:架构审查发现了大量问题,但没有分配修复任务和跟踪进度
- 正确做法:每个发现的问题都创建任务,分配负责人和截止日期,在下次审查时跟踪进展
-
Steering 规则写了但没人遵守
- 问题:Steering 规则文件存在但 AI 编码助手没有加载,或团队成员不了解规则内容
- 正确做法:确保 Steering 规则在 AI 编码助手中正确配置,定期在团队会议中回顾规则
-
忽略架构漂移的早期信号
- 问题:小的架构违规被忽略,逐渐积累成严重的架构退化
- 正确做法:在 CI/CD 中配置架构规则检查(SonarQube Architecture / Dependency Cruiser),违规即阻断合并
-
架构审查变成”批评大会”
- 问题:审查会议变成对开发者的批评,导致团队抵触架构审查
- 正确做法:聚焦于系统改进而非个人责任,使用”我们如何改进”而非”谁写了这个烂代码”的语气
✅ 最佳实践
- 渐进式引入架构审查:从 PR 级自动检查开始,逐步扩展到季度全面审查,不要一次性引入所有检查项
- AI + 人工协作:AI 负责自动化检测(依赖分析、反模式扫描、配置检查),人工负责业务判断(架构合理性、演进方向)
- Steering 规则即架构文档:将架构约束转化为 Steering 规则,既是文档也是自动化约束
- 架构适应度函数:使用 ArchUnit / Dependency Cruiser 编写架构测试,像单元测试一样在 CI 中自动运行
- ADR 驱动审查:每次架构审查都检查现有 ADR 是否仍然有效,过时的 ADR 及时更新或替代
- 可视化架构健康度:建立架构健康度仪表板,让团队随时了解架构状态
- 架构审查培训:定期对团队进行架构审查培训,提升全员的架构意识
- 反模式案例库:积累项目中实际遇到的反模式案例,作为团队的学习资料
相关资源与延伸阅读
- SonarQube Architecture 文档 — Sonar 官方架构分析配置指南,支持意图架构定义和漂移检测
- ArchUnit 用户指南 — Java 架构测试框架,支持分层约束、依赖检查、命名规范等自动化测试
- Dependency Cruiser 文档 — JavaScript/TypeScript 依赖分析工具,支持架构规则定义和可视化
- CodeScene 架构分析 — 行为代码分析平台,支持架构热点分析和 PR 级架构审查
- Architecture Fitness Functions(InfoQ) — 架构适应度函数概念详解,将架构约束转化为自动化测试
- Agentic AI 赋能架构治理(O’Reilly) — AI Agent 如何增强架构治理的方法论
- AI 代码审查中的架构漂移检测 — 使用 MCP 在 AI 辅助开发中强制执行架构模式
- AI 生成代码的反模式与质量退化 — AI 生成代码中常见的架构反模式分析
参考来源
- SonarQube 2025 年度回顾:架构功能发布 (2026-01)
- Sonar 新增架构控制功能 (2025-12)
- CodeScene 架构分析简化 (2025-09)
- AI 辅助代码审查防止生产事故 (2025-08)
- AI 生成代码中的设计缺陷 (2026-06)
- AI 生成代码的新兴代码审查模式 (2025-08)
- 2026 年 AI 代码审查工具对比 (2026-06)
- 架构适应度函数:自动化架构决策 (2026-06)
- 过度工程反模式 (2025)
- 过早优化反模式 (2025)
- 系统设计反模式 (2025-06)
- AI 生成代码的反模式与质量退化 (2025-12)
📖 返回 总览与导航 | 上一节:30c-系统设计文档AI生成 | 下一章:31a-AI辅助测试概览