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。前者更像过程调用,后者更接近资源建模。

csharp
// 伪代码: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 年后 : 微服务强调独立部署与边界清晰

一个更实用的判断方式

你在选择架构风格时,不应该先问“哪个最先进”,而应该先问:

  1. 系统是不是已经需要拆分边界?
  2. 服务之间是更重契约,还是更重资源模型?
  3. 你是要解决企业集成问题,还是互联网 API 问题,还是大规模独立演化问题?

最佳实践

  • SOA 适合强调契约和企业集成的场景。
  • REST 适合资源导向、HTTP 原生风格的 API。
  • 微服务适合需要独立部署和独立演化的系统。
  • 不要把“拆服务”误当成“架构升级”。
  • 先定义边界,再决定协议。
架构风格如何演化:从 SOA 到 REST 与微服务 | Remi Resume