微服务是一种将应用拆分为一组小型、独立部署的服务的架构风格。
| 对比项 | 单体架构 | 微服务架构 |
|---|
| 部署 | 整体部署 | 独立部署 |
| 技术栈 | 统一 | 异构 |
| 扩展 | 整体扩展 | 按需扩展 |
| 故障 | 全局影响 | 局部影响 |
| 团队 | 集中 | 分散 |
| 复杂度 | 代码复杂 | 运维复杂 |
| 场景 | 推荐 |
|---|
| 小团队/初创 | 单体 |
| 大型复杂系统 | 微服务 |
| 快速验证 | 单体 |
| 高并发/多团队 | 微服务 |
| 原则 | 描述 |
|---|
| 单一职责 | 每个服务一个业务能力 |
| 高内聚 | 相关功能放在一起 |
| 松耦合 | 服务间依赖最小化 |
| 独立部署 | 可独立发布 |
| 数据自治 | 每个服务有自己的数据库 |
| 方法 | 描述 |
|---|
| 按业务能力 | 围绕业务功能拆分 |
| 按子域 | DDD 限界上下文 |
| 按用例 | 围绕用户场景 |
| 按数据 | 围绕数据所有权 |
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 订单上下文 │ │ 库存上下文 │ │ 支付上下文 │
│ │ │ │ │ │
│ OrderService │ │InventorySvc │ │PaymentService│
│ OrderDB │ │InventoryDB │ │PaymentDB │
└──────────────┘ └──────────────┘ └──────────────┘
| 方式 | 协议 | 特点 |
|---|
| REST | HTTP/JSON | 简单、通用 |
| gRPC | HTTP2/Protobuf | 高性能、强类型 |
| GraphQL | HTTP/JSON | 灵活查询 |
| 方式 | 协议 | 特点 |
|---|
| 消息队列 | AMQP | 解耦、削峰 |
| 事件驱动 | Kafka | 高吞吐、持久化 |
| 事件总线 | Redis Streams | 轻量级 |
| 模式 | 描述 | 适用场景 |
|---|
| 请求-响应 | 同步调用 | 查询类 |
| 事件通知 | 异步通知 | 状态变更 |
| 事件溯源 | 存储所有事件 | 审计、回放 |
| CQRS | 读写分离 | 复杂查询 |
分布式事务管理:
编排式:
OrderService → CreateOrder → ReserveInventory → ProcessPayment → ConfirmOrder
↓ 失败
CancelOrder ← RefundPayment
协调式:
Saga Coordinator → 调用各服务 → 失败时发送补偿命令
每个服务有独立数据库
服务间直接访问其他服务的数据库
通过 API 或事件共享数据
| 策略 | 描述 |
|---|
| 强一致性 | 2PC(不推荐) |
| 最终一致性 | Saga + 事件 |
| 补偿事务 | 失败时回滚 |
API Gateway → 聚合多个服务的数据 → 返回给客户端
GET /order-details/123
→ OrderService: 订单信息
→ InventoryService: 库存状态
→ PaymentService: 支付状态
→ 组合返回
| 方式 | 描述 |
|---|
| 客户端发现 | 客户端查询注册中心 |
| 服务端发现 | 负载均衡器查询注册中心 |
| 策略 | 描述 |
|---|
| 轮询 | 依次分配 |
| 随机 | 随机分配 |
| 加权 | 按权重分配 |
| 最少连接 | 分配给连接最少的 |
// 熔断器状态机
CLOSED → (错误率超阈值) → OPEN
OPEN → (超时后) → HALF_OPEN
HALF_OPEN → (探测成功) → CLOSED
HALF_OPEN → (探测失败) → OPEN
| 算法 | 描述 |
|---|
| 固定窗口 | 固定时间窗口计数 |
| 滑动窗口 | 平滑计数 |
| 令牌桶 | 匀速生成令牌 |
| 漏桶 | 匀速消费请求 |
| 实践 | 描述 |
|---|
| API 版本化 | /api/v1/resource |
| 幂等设计 | 重复请求结果一致 |
| 健康检查 | /health 端点 |
| 优雅降级 | 依赖失败时的备选方案 |
| 配置外部化 | 环境变量/配置中心 |
| 可观测性 | 日志+指标+追踪 |
| 契约测试 | 消费者驱动契约 |
| CI/CD | 每个服务独立流水线 |