05 · 体系结构风格(Architecture Styles)

📅 预计 60 分钟 | ⭐ = 重要知识点 | 📌 中英术语见文末


5.0 先给直觉:建筑的"整体风格"

设计模式管单个类怎么设计,体系结构风格管整个系统的骨架怎么搭。就像建筑:中式庭院、欧式城堡、现代玻璃幕墙,各有各的布局逻辑,适合不同的用途。软件也有几种反复出现的整体风格,本篇讲四种:

  • 分层架构:上下分明,各层只认邻居。
  • 管道-过滤器:数据像流水线一样流过去。
  • 事件驱动:有事件才动,没事件就歇着。
  • 微服务:把大应用拆成一堆独立小服务。

5.1 分层架构(Layered Architecture)⭐

上下分明,各层只认邻居

分层架构把系统按职责从上到下分成若干层,常见三层:表现层 → 业务层 → 数据访问层。像一栋楼,每层只和上下相邻的楼层打交道,跨层"跳楼"会破坏规则。

表现层       (用户界面:展示、收集输入)
  ↓ 调用
业务层       (核心逻辑:校验、计算、业务规则)
  ↓ 调用
数据访问层    (读写数据库、文件)

要点:

  • 单向依赖:上层依赖下层,下层不反向依赖上层。
  • 隔离变化:换数据库只动数据访问层;换界面只动表现层,业务逻辑不受影响。
  • 每一层对上层提供接口、对下层隐藏实现细节,层与层之间通过接口通信。

⚠️ 常见错误

  1. 业务逻辑泄漏到表现层(在按钮事件里直接写 SQL),层就名存实亡。
  2. 下层反过来调用上层,形成循环依赖,改动互相波及。

5.2 管道-过滤器(Pipe-and-Filter)⭐

流水线上的一道道工序

管道-过滤器把系统拆成一系列过滤器(filter),数据沿着管道(pipe)从一个过滤器流向下一个。像汽车装配流水线:冲压 → 焊接 → 喷漆 → 总装,每道工序处理上一道传来的半成品,再把结果交给下一道。

def filter_upper(text):  return text.upper()
def filter_split(text):  return text.split()
def filter_count(words): return len(words)

text = "hello world"
t = filter_upper(text)     # HELLO WORLD
t = filter_split(t)        # ['HELLO', 'WORLD']
result = filter_count(t)   # 2

特点:

  • 每个过滤器职责单一,输入输出只依赖数据流,彼此不直接认识。
  • 过滤器可以自由增删、重排,只要接口一致,流水线随时重组。
  • 典型应用:Unix 命令行管道 cat a.txt | grep key | sort、图像/音频处理链、编译器的词法 → 语法 → 语义分析。

⚠️ 常见错误

  1. 过滤器之间共享全局状态,破坏"独立可替换"的特性,一个过滤器出问题会连累整条链。
  2. 管道中传输的数据格式频繁变化,导致每个过滤器都要跟着改——数据格式应稳定统一。

5.3 事件驱动架构(Event-Driven Architecture)⭐

有事件才动,没事件就歇着

事件驱动风格里,组件不主动调用对方,而是发布事件、订阅事件。像微信群:你发一条消息(事件),群成员谁感兴趣谁响应;发布者根本不需要知道谁在听。

典型结构:

  • 事件(event):发生了什么事(如"订单已创建")。
  • 事件生产者(producer):产生事件并广播。
  • 事件消费者(consumer):订阅并处理感兴趣的事件。
  • 中间常有一层事件总线 / 消息队列(broker)负责分发。

好处:

  • 解耦:生产者和消费者互不认识,新增消费者不需要修改生产者。
  • 异步:事件发布后立即返回,不阻塞,吞吐量高。

代价:事件流向难以追踪,调试变难;"订单创建后必须发邮件"这类一致性保证,在异步下要额外设计确认与补偿。

⚠️ 常见错误

  1. 事件命名随意、缺乏版本管理,事件格式一升级,旧订阅方直接崩溃。
  2. 把"必须同步确认完成"的需求硬塞进异步事件流,导致系统无法判断处理是否真的完成。

5.4 微服务架构(Microservices)⭐

把大应用拆成一堆独立小服务

微服务把一个单体应用拆成多个独立部署的小服务,每个服务围绕一个业务能力,通过 API(常是 HTTP/REST)互相通信。像一个综合商场拆成一排独立店铺:水果店、服装店各自独立经营,共用停车场(基础设施)。

对比单体架构

  • 单体:整个系统一个进程,开发部署简单;但改一处要整体重新部署,规模大了互相牵制、难以维护。
  • 微服务:每个服务独立开发、独立部署、独立伸缩,技术栈可以不同;但引入了分布式复杂度——网络延迟、服务发现、链路追踪、数据一致性。

适合微服务的情形:团队多人并行开发、模块边界清晰、需要按服务独立伸缩。不适合:系统很小、边界模糊、团队维护一堆服务力不从心。

⚠️ 常见错误

  1. 为了"上微服务"而拆微服务,把强耦合的代码硬拆成多个服务,跨服务调用反而更慢、更乱。
  2. 忽视分布式事务与数据一致性,各服务数据各存各的,出问题难以对账。

📌 术语对照(中英)

中文 English
分层架构 Layered Architecture
管道-过滤器 Pipe-and-Filter
事件驱动 Event-Driven Architecture
消息队列 Message Queue
微服务 Microservices
单体架构 Monolith

🎯 复习清单

  • 四种体系结构风格各自的整体结构与适用场景。
  • 分层架构的单向依赖原则,以及层的隔离价值。
  • 管道-过滤器如何做到"自由增删、重排"过滤器。
  • 事件驱动如何解耦生产者和消费者,以及异步带来的代价。
  • 单体 vs 微服务的取舍标准。