SD-05 体系结构风格
05 · 体系结构风格(Architecture Styles)
📅 预计 60 分钟 | ⭐ = 重要知识点 | 📌 中英术语见文末
5.0 先给直觉:建筑的"整体风格"
设计模式管单个类怎么设计,体系结构风格管整个系统的骨架怎么搭。就像建筑:中式庭院、欧式城堡、现代玻璃幕墙,各有各的布局逻辑,适合不同的用途。软件也有几种反复出现的整体风格,本篇讲四种:
- 分层架构:上下分明,各层只认邻居。
- 管道-过滤器:数据像流水线一样流过去。
- 事件驱动:有事件才动,没事件就歇着。
- 微服务:把大应用拆成一堆独立小服务。
5.1 分层架构(Layered Architecture)⭐
上下分明,各层只认邻居
分层架构把系统按职责从上到下分成若干层,常见三层:表现层 → 业务层 → 数据访问层。像一栋楼,每层只和上下相邻的楼层打交道,跨层"跳楼"会破坏规则。
表现层 (用户界面:展示、收集输入)
↓ 调用
业务层 (核心逻辑:校验、计算、业务规则)
↓ 调用
数据访问层 (读写数据库、文件)
要点:
- 单向依赖:上层依赖下层,下层不反向依赖上层。
- 隔离变化:换数据库只动数据访问层;换界面只动表现层,业务逻辑不受影响。
- 每一层对上层提供接口、对下层隐藏实现细节,层与层之间通过接口通信。
⚠️ 常见错误
- 业务逻辑泄漏到表现层(在按钮事件里直接写 SQL),层就名存实亡。
- 下层反过来调用上层,形成循环依赖,改动互相波及。
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、图像/音频处理链、编译器的词法 → 语法 → 语义分析。
⚠️ 常见错误
- 过滤器之间共享全局状态,破坏"独立可替换"的特性,一个过滤器出问题会连累整条链。
- 管道中传输的数据格式频繁变化,导致每个过滤器都要跟着改——数据格式应稳定统一。
5.3 事件驱动架构(Event-Driven Architecture)⭐
有事件才动,没事件就歇着
事件驱动风格里,组件不主动调用对方,而是发布事件、订阅事件。像微信群:你发一条消息(事件),群成员谁感兴趣谁响应;发布者根本不需要知道谁在听。
典型结构:
- 事件(event):发生了什么事(如"订单已创建")。
- 事件生产者(producer):产生事件并广播。
- 事件消费者(consumer):订阅并处理感兴趣的事件。
- 中间常有一层事件总线 / 消息队列(broker)负责分发。
好处:
- 解耦:生产者和消费者互不认识,新增消费者不需要修改生产者。
- 异步:事件发布后立即返回,不阻塞,吞吐量高。
代价:事件流向难以追踪,调试变难;"订单创建后必须发邮件"这类一致性保证,在异步下要额外设计确认与补偿。
⚠️ 常见错误
- 事件命名随意、缺乏版本管理,事件格式一升级,旧订阅方直接崩溃。
- 把"必须同步确认完成"的需求硬塞进异步事件流,导致系统无法判断处理是否真的完成。
5.4 微服务架构(Microservices)⭐
把大应用拆成一堆独立小服务
微服务把一个单体应用拆成多个独立部署的小服务,每个服务围绕一个业务能力,通过 API(常是 HTTP/REST)互相通信。像一个综合商场拆成一排独立店铺:水果店、服装店各自独立经营,共用停车场(基础设施)。
对比单体架构:
- 单体:整个系统一个进程,开发部署简单;但改一处要整体重新部署,规模大了互相牵制、难以维护。
- 微服务:每个服务独立开发、独立部署、独立伸缩,技术栈可以不同;但引入了分布式复杂度——网络延迟、服务发现、链路追踪、数据一致性。
适合微服务的情形:团队多人并行开发、模块边界清晰、需要按服务独立伸缩。不适合:系统很小、边界模糊、团队维护一堆服务力不从心。
⚠️ 常见错误
- 为了"上微服务"而拆微服务,把强耦合的代码硬拆成多个服务,跨服务调用反而更慢、更乱。
- 忽视分布式事务与数据一致性,各服务数据各存各的,出问题难以对账。
📌 术语对照(中英)
| 中文 | English |
|---|---|
| 分层架构 | Layered Architecture |
| 管道-过滤器 | Pipe-and-Filter |
| 事件驱动 | Event-Driven Architecture |
| 消息队列 | Message Queue |
| 微服务 | Microservices |
| 单体架构 | Monolith |
🎯 复习清单
- 四种体系结构风格各自的整体结构与适用场景。
- 分层架构的单向依赖原则,以及层的隔离价值。
- 管道-过滤器如何做到"自由增删、重排"过滤器。
- 事件驱动如何解耦生产者和消费者,以及异步带来的代价。
- 单体 vs 微服务的取舍标准。