前置知识: 云计算

微服务架构

5 min中级

微服务架构设计:拆分策略、通信模式、数据管理与服务治理详解。

1. 微服务概述

1.1 什么是微服务

微服务是一种将应用拆分为一组小型、独立部署的服务的架构风格。

1.2 与单体架构对比

对比项单体架构微服务架构
部署整体部署独立部署
技术栈统一异构
扩展整体扩展按需扩展
故障全局影响局部影响
团队集中分散
复杂度代码复杂运维复杂

1.3 何时使用微服务

场景推荐
小团队/初创单体
大型复杂系统微服务
快速验证单体
高并发/多团队微服务

2. 服务拆分策略

2.1 拆分原则

原则描述
单一职责每个服务一个业务能力
高内聚相关功能放在一起
松耦合服务间依赖最小化
独立部署可独立发布
数据自治每个服务有自己的数据库

2.2 拆分方法

方法描述
按业务能力围绕业务功能拆分
按子域DDD 限界上下文
按用例围绕用户场景
按数据围绕数据所有权

2.3 DDD 限界上下文

flowchart TD
    subgraph O[订单上下文]
        OS[OrderService] OD[OrderDB]
    end
    subgraph I[库存上下文]
        IS[InventorySvc] ID[InventoryDB]
    end
    subgraph P[支付上下文]
        PS[PaymentService] PD[PaymentDB]
    end

3. 服务通信

3.1 同步通信

方式协议特点
RESTHTTP/JSON简单、通用
gRPCHTTP2/Protobuf高性能、强类型
GraphQLHTTP/JSON灵活查询

3.2 异步通信

方式协议特点
消息队列AMQP解耦、削峰
事件驱动Kafka高吞吐、持久化
事件总线Redis Streams轻量级

3.3 通信模式

模式描述适用场景
请求-响应同步调用查询类
事件通知异步通知状态变更
事件溯源存储所有事件审计、回放
CQRS读写分离复杂查询

3.4 Saga 模式

跨服务分布式事务的主流解法:把事务拆成一系列本地事务,每步都有对应 的补偿操作,失败时反向补偿(而不是回滚数据库)。

编舞式(Choreography,无中心):服务通过事件互相触发,谁也不指挥谁:

OrderService → 事件 OrderCreated → InventoryService 预留库存
             → 事件 InventoryReserved → PaymentService 扣款
                      ↓ 任一步失败
        发布补偿事件:CancelOrder ← RefundPayment

编排式(Orchestration,有中心):由协调器(或订单服务自身)顺序 调用各参与方,失败时由协调器执行补偿命令:

Saga 协调器 → 调用 ReserveInventory → 调用 ProcessPayment
                    ↓ 失败
        协调器 → RefundPayment → CancelOrder
形态优点缺点
编舞式松耦合、无单点流程散落在事件里,难追踪全局
编排式流程集中可见、易加步骤协调器可能成为瓶颈/单点

简单流程(2-3 步)用编舞式,复杂长流程(步骤多、需监控)用编排式。

4. 数据管理

4.1 数据库每服务一个

每个服务独占自己的数据库
服务间禁止直接访问对方的数据库(只能走 API 或事件)
跨服务查询通过 API 组合或数据复制实现

这条是微服务数据架构的红线:一旦 A 服务直连 B 服务的库,B 的 schema 变更就会破坏 A,两个服务事实上被焊死——「独立部署」从此名存实亡。

4.2 数据一致性

策略描述
强一致性2PC(不推荐)
最终一致性Saga + 事件
补偿事务失败时回滚

4.3 API 组合

API Gateway → 聚合多个服务的数据 → 返回给客户端

GET /order-details/123
  → OrderService: 订单信息
  → InventoryService: 库存状态
  → PaymentService: 支付状态
  → 组合返回

5. 服务治理

5.1 服务发现

方式描述
客户端发现客户端查询注册中心
服务端发现负载均衡器查询注册中心

5.2 负载均衡

策略描述
轮询依次分配
随机随机分配
加权按权重分配
最少连接分配给连接最少的

5.3 熔断器

// 熔断器状态机
CLOSED → (错误率超阈值) → OPEN
OPEN → (超时后) → HALF_OPEN
HALF_OPEN → (探测成功) → CLOSED
HALF_OPEN → (探测失败) → OPEN

5.4 限流

算法描述
固定窗口固定时间窗口计数
滑动窗口平滑计数
令牌桶匀速生成令牌
漏桶匀速消费请求

6. 微服务最佳实践

实践描述
API 版本化/api/v1/resource
幂等设计重复请求结果一致
健康检查/health 端点
优雅降级依赖失败时的备选方案
配置外部化环境变量/配置中心
可观测性日志+指标+追踪
契约测试消费者驱动契约
CI/CD每个服务独立流水线

小结

  • 初学者要点:微服务的本质代价是「代码复杂度换运维复杂度」,小团队与 快速验证场景先单体;拆分按业务能力/DDD 限界上下文,不做技术分层拆分; 数据库每服务一个、禁止跨库直连;跨服务事务用 Saga 而不是 2PC。
  • 进阶注意:同步调用链会把延迟与故障串联,优先考虑事件驱动;通信只允许 走 API/事件这条「红线」决定了架构能否长期演进;可观测性(追踪 + 拓扑) 是微服务排错的生命线(见 170-Observability);服务网格与 API 网关 的治理能力扩展见 160-ServiceMesh;从单体演进微服务时,「先按限界 上下文拆模块(逻辑拆分),再按需拆部署(物理拆分)」是风险最低的路径。