从单体到微服务、从管道过滤器到事件驱动,一图看懂软件架构的演进脉络与核心思想
「架构」= 一族约束的拓扑结构
每种风格都定义一套特定的元素类型和关系模式。就像建筑风格(哥特式 vs 现代主义)决定了建筑的形态与功能分区。
「数据在管道中逐级过滤变换」——每个处理单元(Filter)独立完成一个功能,通过管道(Pipe)将数据传递给下一个单元。
输出是前一个过滤器的输入,链式组合完成复杂处理任务。这是 Unix 哲学的精髓:cmd1 | cmd2 | cmd3。
典型应用场景:
系统按职责划分为若干层,每层只依赖下层的服务,上层调用下层。这种严格的分层保证了系统的可维护性和可替换性。
只允许单向向下依赖——上层不知道下层的实现细节,只知道接口契约。
常见分层变体:
「发生了一件事,谁关心就通知谁」 —— 组件之间不直接互相调用,而是通过发送/接收事件消息来间接通信。
生产者只管发事件,消费者自己决定是否订阅。彻底解耦了调用者和被调用者之间的直接依赖。
相关概念体系:
「将单一应用程序划分成一组小的服务」,每个服务运行在自己的进程中,通过轻量级的 HTTP/gRPC 通信机制协同工作。
每个服务围绕特定业务能力构建,可独立开发、独立部署、独立扩展。
核心设计原则:
微服务的代价(必须清醒认识):
「客户端负责展示 + 部分逻辑,服务器负责数据存储和核心业务」。典型的胖客户端模式,客户端安装专用软件。
两层架构(2-Tier):客户端直连数据库服务器,后来发展为三层(3-Tier):Client → Application Server → Database Server。
「浏览器作为通用客户端,零安装即用」——B/S 是 C/S 的特殊形式,只不过客户端统一成了浏览器(Browser)。
Web 技术的成熟让 B/S 成为主流企业应用架构,免安装、跨平台、易更新是最大优势。
| 维度 | C/S 架构 | B/S 架构 |
|---|---|---|
| 客户端要求 | 需安装专用客户端程序 | 只需浏览器,零安装 |
| 用户体验 | 响应速度快,界面丰富流畅 | 依赖网络,体验略逊但差距缩小 |
| 开发维护 | 客户端需单独更新版本 | 服务端更新即可,客户端自动生效 |
| 跨平台能力 | 弱,需为各平台分别开发 | 强,浏览器天然跨平台 |
| 安全性 | 相对可控,可做更多本地安全策略 | 依赖 HTTPS/CORS 等Web安全机制 |
| 网络依赖 | 可离线工作(部分功能) | 基本完全依赖网络 |
| 硬件资源 | 客户端承担较多计算压力 | 主要靠服务端算力 |
| 适用场景 | 专业工具、游戏、离线优先应用 | 企业管理系统、SaaS、信息门户 |
| 架构风格 | 核心关键词 | 典型场景 | 复杂度 |
|---|---|---|---|
| 管道-过滤器 | 链式变换 / 流式处理 | 编译器、ETL、中间件 | ⭐⭐ 低 |
| 分层架构 | 关注点分离 / 单向依赖 | 企业级 Web 应用、MVC | ⭐⭐⭐ 中 |
| 事件驱动 | 发布订阅 / 异步解耦 | 消息队列、EDA、CQRS | ⭐⭐⭐⭐ 较高 |
| 微服务 | 独立部署 / 分布式治理 | 大规模互联网平台 | ⭐⭐⭐⭐⭐ 高 |
| C/S & B/S | 客户端-服务器 / 浏览器 | 桌面应用 / Web 应用 | ⭐⭐ ~ ⭐⭐⭐⭐ |