2026-06-08 / 架构
架构风格如何演化:从 SOA 到 REST 与微服务
当系统从单体走向分布式,架构风格就开始变得重要。因为这时你不只是“写功能”,而是在决定:
架构系统设计演进
架构风格如何演化:从 SOA 到 REST 与微服务
当系统从单体走向分布式,架构风格就开始变得重要。因为这时你不只是“写功能”,而是在决定:
- 服务怎么表示资源。
- 通信怎么设计。
- 契约怎么约束。
- 各个服务怎么独立演化。
SOA、REST 和微服务不是同一个层次上的东西,但它们都在回答“如何组织服务和通信”。
flowchart LR
A["传统系统"] --> B["SOA"]
B --> C["REST"]
C --> D["微服务"]
SOA 是什么
SOA 的重点在于服务化和契约化。它强调:
- 功能单元被拆成服务。
- 服务之间通过定义良好的接口和契约联系起来。
- 接口要尽量中立,不依赖具体硬件、操作系统和语言。
这让不同系统之间更容易互操作,也更适合企业级集成的场景。
SOA 的特点
- 可从企业外部访问。
- 随时可用。
- 粗粒度服务接口。
- 松散耦合。
- 可重用服务。
- 标准化服务契约。
REST 为什么后来流行
REST 不是“HTTP API 的代名词”,它是一种架构风格。它围绕资源、无状态、统一接口、缓存和分层系统这些约束来设计。
REST 之所以流行,是因为它比 SOAP/XML-RPC 更简单,更贴近 Web 的天然模型。
flowchart TB
A["资源"] --> B["URI"]
B --> C["HTTP 动词"]
C --> D["无状态交互"]
D --> E["缓存 / 分层 / 统一接口"]
REST 的几个关键点
- 一切都围绕资源。
- URL 通常表达名词而不是动作。
- 使用 HTTP 方法表达操作。
- 服务尽量无状态。
一个场景
与其设计 /get_user?id=3,不如设计 GET /users/3。前者更像过程调用,后者更接近资源建模。
// 伪代码:REST 风格通常会围绕资源表达
[HttpGet("/users/{id}")]
public ActionResult<UserDto> GetUser(long id) => ...
微服务和 SOA / REST 的关系
微服务不是 SOA 的简单翻版,也不是 REST 的别名。它更像是把“按业务能力拆分、独立部署、独立演化”这个思路推进到更细的粒度。
微服务常见特点:
- 每个服务独立部署。
- 每个服务围绕一个小业务能力。
- 每个服务维护自己的数据和测试。
- 服务之间通过轻量协议协作。
这意味着,微服务既会用到 REST,也可能用到 gRPC 或其他通信方式。它关心的是边界和独立性,不是某一种协议本身。
演化脉络
架构风格的演化,通常是因为系统复杂度改变了:
- SOA 解决企业系统集成和契约化问题。
- REST 解决 Web 交互的简洁性问题。
- 微服务解决大规模系统的独立部署和独立演化问题。
timeline
title 架构风格演化
2000 年左右 : SOA 关注企业级服务契约
2000 年后 : REST 适配 Web 资源模型
2010 年后 : 微服务强调独立部署与边界清晰
一个更实用的判断方式
你在选择架构风格时,不应该先问“哪个最先进”,而应该先问:
- 系统是不是已经需要拆分边界?
- 服务之间是更重契约,还是更重资源模型?
- 你是要解决企业集成问题,还是互联网 API 问题,还是大规模独立演化问题?
最佳实践
- SOA 适合强调契约和企业集成的场景。
- REST 适合资源导向、HTTP 原生风格的 API。
- 微服务适合需要独立部署和独立演化的系统。
- 不要把“拆服务”误当成“架构升级”。
- 先定义边界,再决定协议。