05 — 架构设计原则

核心规律:高内聚低耦合,关注点分离 一句话:好的架构让变更容易,坏的架构让变更痛苦


一、核心规律

1.1 架构演进路径

flowchart LR
    A["单体架构<br/>代码全部耦合"] --> B["模块化单体<br/>按域拆分"]
    B --> C["微服务架构<br/>服务独立部署"]
    C --> D["服务网格<br/>基础设施解耦"]
    
    style A fill:#e3f2fd
    style B fill:#fff3e0
    style C fill:#e8f5e9
    style D fill:#f3e5f5

核心规律:架构演进是复杂度的转移,不是消除。单体→微服务,复杂度从代码转移到基础设施。

1.2 架构决策四原则

1. 业务驱动架构:架构服务于业务,不是反过来
2. 演进式设计:先做对的,再做对的事
3. 简单优于复杂:能用单体的别上微服务
4. 可-evolve:架构要能随业务演进

二、经典架构模式

2.1 MVC模式

flowchart LR
    V["View<br/>视图层<br/>展示数据"] --> C["Controller<br/>控制器<br/>处理请求"]
    C --> M["Model<br/>模型层<br/>业务逻辑"]
    M --> V
    
    style C fill:#FFD700
    style M fill:#e8f5e9
    style V fill:#e3f2fd
层级职责不应做的事
Model数据+业务规则不含HTTP逻辑
View展示数据不含业务逻辑
Controller请求路由+参数验证不含业务逻辑

2.2 DDD领域驱动设计

flowchart TB
    subgraph 外部层["🌐 外部层"]
        Ext["Http/CLI/Queue"]
    end
    
    subgraph 应用层["⚙️ 应用层 Application"]
        App["Service<br/>编排业务"]
    end
    
    subgraph 领域层["🎯 领域层 Domain ← 核心"]
        Dom["Entity<br/>实体"]
        Dom2["Value Object<br/>值对象"]
        Dom3["Repository<br/>仓储接口"]
    end
    
    subgraph 基础设施层["🔧 基础设施 Infrastructure"]
        Infra["Repository实现<br/>数据库/缓存"]
    end
    
    Ext --> App --> Dom
    Dom --> Infra
    Infra -.->|"实现接口"| Dom3
    
    style Dom fill:#FFD700
    style Dom2 fill:#FFD700
    style Dom3 fill:#FFD700

DDD核心规律:领域层不依赖任何外部层,外部层依赖领域层。

2.3 分层架构

表现层(Controller)→ 业务层(Service)→ 领域层(Domain)→ 基础设施层(Repository)
     ↑                      ↑                  ↑                    ↑
   HTTP请求               业务编排            业务规则            数据持久化

三、架构设计原则(SOLID)

3.1 五大原则

原则英文一句话反例
单一职责SRP一个类只做一件事UserController含业务逻辑
开闭原则OCP对扩展开放,对修改关闭新增支付方式要改Order类
里氏替换LSP子类可替换父类子类破坏了父类契约
接口隔离ISP接口要小而专大接口强制实现不用的方法
依赖倒置DIP依赖抽象不依赖具体Controller直接new Service

3.2 代码示例

// ❌ 违反SRP:一个类做太多事
class OrderService {
    public function create(array $data) { /* 业务逻辑 */ }
    public function sendEmail() { /* 发邮件 */ }      // 不应在这里
    public function calculateTax() { /* 算税 */ }      // 不应在这里
}
 
// ✅ 符合SRP:职责分离
class OrderService {
    public function create(array $data): Order { /* 仅业务逻辑 */ }
}
 
class OrderEmailNotifier {
    public function notify(Order $order): void { /* 仅发邮件 */ }
}
 
class TaxCalculator {
    public function calculate(Order $order): float { /* 仅算税 */ }
}

四、单体 vs 微服务

4.1 决策矩阵

quadrantChart
    title 单体 vs 微服务决策
    x-axis 团队规模:小 --> 团队规模:大
    y-axis 变更频率:低 --> 变更频率:高
    quadrant-1 微服务方案
    quadrant-2 单体方案
    quadrant-3 空白
    quadrant-4 微服务方案
    
    "小型初创项目": [0.2, 0.3]
    "中型业务系统": [0.4, 0.6]
    "大型电商平台": [0.8, 0.9]
    "内部工具": [0.2, 0.2]
    "快速迭代产品": [0.6, 0.9]

4.2 微服务拆分边界

拆分原则:
├── 业务边界:按领域拆分(订单/用户/商品)
├── 数据边界:每个服务拥有自己的数据库
├── 团队边界:康威定律,组织结构与系统结构一致
└── 部署边界:可独立部署,独立扩缩容

五、本章总结

核心规律:架构的本质是管理复杂度。好的架构让新增功能容易,坏的架构让变更痛苦。没有银弹,只有权衡。

关键记忆点

  • ✅ 高内聚低耦合是架构的核心目标
  • ✅ DDD让领域逻辑与基础设施解耦
  • ✅ SOLID是代码质量的五大准则
  • ✅ 单体先于微服务,演进而非跳跃

延伸阅读