软考
在游戏中攻打此考点微服务与分布式系统深化
微服务拆分 DDD / 注册发现 Eureka·Nacos·Consul·ZooKeeper / 网关 / 熔断 Hystrix·Sentinel / 限流(令牌桶·漏桶·滑动窗口)/ 负载均衡(一致性哈希)/ 分布式事务 7 方案 + Seata 4 模式 / 消息队列 / Service Mesh
一句话定位
2024-2025 真题显示微服务 + 分布式事务 + 秒杀限流是案例与论文新主战场——本篇把限流算法、Seata 4 模式、一致性哈希等细节落成可默写的对比表 + 答题套路。
NOTE
本篇是 05-new-tech-web-arch.mdx 的”微服务深化版”。事实据教材第 2 版 + 2020-2025 真题核对(2026-07-29)。
A. 微服务拆分原则(论文级深度)
A1 单体 vs 微服务对比
| 维度 | 单体 | 微服务 |
|---|---|---|
| 部署 | 一个包 | 多个独立服务 |
| 扩展 | 整体复制 | 按需独立扩展 |
| 技术栈 | 统一 | 灵活(每服务一栈) |
| 数据 | 共享 DB | 每服务独立 DB |
| 团队 | 大团队 | 小团队自治(2-pizza) |
| 故障 | 一处故障全局 | 故障隔离 |
| 复杂度 | 业务复杂度 | 分布式复杂度(运维/网络/一致性) |
| 测试 | 简单 | 难(端到端) |
A2 DDD 战术设计
| 概念 | 含义 |
|---|---|
| 限界上下文 Bounded Context | 模型边界,每个微服务对应一个 |
| 子域 Subdomain | 核心子域(业务核心)/ 支持子域(辅助)/ 通用子域(通用如认证) |
| 上下文映射 Context Mapping | 多上下文关系:合作 Partnership / 共享内核 Shared Kernel / 客户-供应商 Customer-Supplier / 防腐层 ACL |
A3 拆分原则
- 单一职责:一个服务一个业务能力
- 限界上下文:明确边界,避免跨服务调用爆炸
- 业务能力:按业务流程拆(如订单/支付/库存)
- 数据自治:每服务独立 DB
- 粒度权衡:过粗 = 单体;过细 = 运维爆炸(“纳米服务”反模式)
A4 适用 vs 不适用
| 适用 | 不适用 |
|---|---|
| 业务边界清晰 | 业务简单(CRUD) |
| 团队规模 > 10 | 团队 < 5 |
| 需独立扩展(部分服务高负载) | 全系统低负载 |
| 多技术栈需求 | 单一技术栈足够 |
B. 服务注册与发现(必考 1 题)
B1 客户端发现 vs 服务端发现
| 模式 | 说明 | 代表 |
|---|---|---|
| 客户端发现 | 客户端查注册中心,自己负载均衡 | Netflix Ribbon + Eureka |
| 服务端发现 | 客户端请求路由器/网关,由其转发 | Nginx + Consul / K8s Service |
B2 主流注册中心对比(必考)
| 注册中心 | CAP | 一致性算法 | 特点 | 适用 |
|---|---|---|---|---|
| ZooKeeper | CP | ZAB | 强一致;不适合大规模服务发现(性能瓶颈) | Hadoop/Kafka 协调 |
| Eureka | AP | Peer-to-Peer 复制 | 高可用;自我保护模式;Spring Cloud 默认 | 大规模服务发现 |
| Consul | CP | Raft | 强一致 + 健康检查 + KV + 多 DC | 多数据中心 |
| Nacos | AP/CP 可切换(默认 AP) | Distro + Raft | 注册 + 配置中心一体化;阿里开源 | Spring Cloud Alibaba |
| etcd | CP | Raft | K8s 底层存储 | K8s 生态 |
B3 关键机制
- 心跳:服务定期发送心跳(默认 30s)
- 自我保护模式(Eureka):15 分钟内心跳丢失 > 85%,Eureka 不再剔除实例(防止网络分区误删)
- 健康检查:Consul HTTP/TCP/Script
- 服务下线:主动注销 + 超时被动剔除
B4 真题举一反三
2022-11 综合:Eureka 属于哪类 CAP?
- 解:AP(高可用优先)
2025-11 综合:某电商需高可用注册中心,网络分区时仍可查询服务,应选?
- 解:Nacos(AP 模式) 或 Eureka
C. API 网关(高频)
C1 核心功能
| 功能 | 说明 |
|---|---|
| 路由转发 | 按路径转发到后端服务 |
| 鉴权 Authentication | JWT / OAuth2 校验 |
| 限流 Rate Limiting | 令牌桶 / 漏桶 |
| 熔断 Circuit Breaker | Hystrix / Sentinel |
| 日志监控 | 访问日志 + 调用统计 |
| 协议转换 | HTTP ↔ gRPC ↔ WebSocket |
| 负载均衡 | 集成 Ribbon / LoadBalancer |
| 响应聚合 | 多服务结果合并(BFF 模式) |
C2 典型实现
| 网关 | 类型 | 特点 |
|---|---|---|
| Spring Cloud Gateway | Java | Spring 生态主流;基于 Reactor |
| Zuul | Java | Netflix;Zuul 1 同步、Zuul 2 异步 |
| Kong | Lua + Nginx | 插件丰富;高性能 |
| Nginx + Lua | C + Lua | 灵活;高并发 |
| APISIX | Lua + Nginx | 国内开源;动态路由 |
C3 BFF(Backend for Frontend)
为不同前端(Web/Mobile/IoT)提供专属网关层,避免业务服务为多端适配。
D. 熔断降级(必考 1 题)
D1 熔断器三态
| 状态 | 行为 |
|---|---|
| Closed 闭合 | 正常请求;统计错误率 |
| Open 断开 | 直接返回 fallback(不调下游);等待休眠期 |
| Half-Open 半开 | 允许少量试探请求;成功 → Closed,失败 → Open |
D2 Hystrix vs Sentinel vs Resilience4j
| 工具 | 厂商 | 隔离方式 | 特点 |
|---|---|---|---|
| Hystrix | Netflix(已停止维护) | 线程池 / 信号量 | 老牌;fallback 机制 |
| Sentinel | 阿里 | 信号量 | 流控 + 熔断 + 系统自适应 + 实时监控;Spring Cloud Alibaba |
| Resilience4j | 开源 | 函数式风格 | 受 Hystrix 启发,推荐替代 |
D3 熔断 vs 降级 vs 限流
IMPORTANT
三者区分 callout(必考):
- 熔断 Circuit Breaker:依赖服务故障时断开保护本服务(不调下游,避免级联雪崩)
- 降级 Degradation:本服务整体过载或非核心功能故障,牺牲非核心保核心(如关闭推荐/评论,保留下单)
- 限流 Rate Limiting:请求超过阈值,拒绝部分请求(保系统不崩)
关系:熔断是降级的一种触发方式;限流是预防,熔断是事后保护。
D4 真题举一反三
2024-05 综合:Hystrix 熔断器在错误率达多少时打开?
- 解:默认 50%(可配置)
2025-11 综合:某系统依赖服务故障,断开连接保护本服务,称为什么?
- 解:熔断
E. 限流算法(必考 1 题)
E1 四种限流算法
| 算法 | 原理 | 优点 | 缺点 |
|---|---|---|---|
| 固定窗口计数 | 时间窗口内计数 | 简单 | 临界点双倍流量问题 |
| 滑动窗口 Sliding Window | 细化窗口降低临界 | 平滑 | 内存稍多 |
| 漏桶 Leaky Bucket | 恒定速率流出 + 桶满丢弃 | 平滑输出 | 不允许突发 |
| 令牌桶 Token Bucket | 恒定速率生成令牌 + 桶满丢弃 | 允许突发 | 实现略复杂 |
E2 漏桶 vs 令牌桶(高频对比)
IMPORTANT
漏桶 vs 令牌桶 callout:
- 漏桶:以恒定速率流出(处理请求),桶满则丢弃新请求 → 平滑输出,不允许突发
- 令牌桶:以恒定速率生成令牌,请求必须取到令牌才处理;桶可累积令牌 → 允许突发流量(累积的令牌一次性消耗)
关键差异:突发流量处理能力。令牌桶更适合实际业务(秒杀等突发场景)。
E3 实现
| 实现 | 说明 |
|---|---|
| Nginx limit_req | 漏桶 |
| Sentinel | 滑动窗口 + 令牌桶 |
| Guava RateLimiter | 令牌桶 |
| Redis + Lua | 分布式限流 |
E4 真题举一反三
2021-11 综合:限流算法中允许突发流量的是?
- 解:令牌桶
2024-11 综合:滑动窗口相比固定窗口的优势?
- 解:降低临界点双倍流量问题
F. 负载均衡(必考 1 题)
F1 客户端负载 vs 服务端负载
| 类型 | 说明 | 代表 |
|---|---|---|
| 客户端负载 | 客户端从注册中心拉取实例列表,自己选 | Ribbon / Spring Cloud LoadBalancer |
| 服务端负载 | 客户端请求负载均衡器,由其转发 | Nginx / F5 / LVS |
F2 算法对比
| 算法 | 原理 | 优缺点 |
|---|---|---|
| 轮询 Round Robin | 依次轮流 | 简单;不考虑性能差异 |
| 加权轮询 Weighted RR | 按权重分配 | 适合异构集群 |
| 最少连接 Least Connections | 选当前连接最少 | 适合长连接 |
| 源地址哈希 IP Hash | 同 IP 固定后端 | 会话保持;不均 |
| 一致性哈希 Consistent Hash | 环空间 + 虚拟节点 | 节点增减影响小;缓存友好 |
| 最短响应时间 | 选响应最快 | 性能最优;监控开销 |
F3 一致性哈希
IMPORTANT
一致性哈希原理 callout:
- 环空间:哈希值 0 ~ 2³²⁻¹ 排成环
- 节点入环:每节点哈希到环上某位置
- 数据路由:数据 key 哈希 → 顺时针找最近节点
- 虚拟节点:解决数据倾斜(节点少时不均);每物理节点对应 100~200 个虚拟节点
- 节点增减:只影响相邻段数据,其他不动(vs 简单哈希需全部重新映射)
F4 L4 vs L7 负载
| 层 | 基于 | 代表 | 特点 |
|---|---|---|---|
| L4 传输层 | IP + 端口 | LVS / F5 | 性能高;不解析协议 |
| L7 应用层 | HTTP 头 / URL / Cookie | Nginx / HAProxy | 灵活;解析开销 |
F5 真题举一反三
2023-05 综合:一致性哈希相比简单哈希的优势?
- 解:节点增减时只影响相邻段,不全部重新映射
2025-05 综合:某场景需保持用户会话与同一后端绑定,应选?
- 解:IP Hash 或 一致性哈希
G. 分布式事务(论文最高频)
G1 理论基础
- CAP:C/A/P 三选二
- BASE:基本可用 / 软状态 / 最终一致
G2 分布式事务 7 方案对比表(核心必背)
| 方案 | 一致性 | 性能 | 复杂度 | 业务侵入 | 适用场景 |
|---|---|---|---|---|---|
| 2PC 两阶段提交 | 强一致 | 差 | 中 | 无 | 数据库 XA |
| 3PC 三阶段提交 | 强一致 | 差 | 高 | 无 | 减阻塞 |
| TCC Try-Confirm-Cancel | 最终一致 | 好 | 中 | 大(需 3 方法) | 高并发金融 |
| Saga 长事务 | 最终一致 | 好 | 中 | 中(补偿) | 长流程业务 |
| 本地消息表 | 最终一致 | 好 | 低 | 中 | 跨服务异步 |
| 事务消息(RocketMQ) | 最终一致 | 好 | 低 | 低 | 消息驱动 |
| 最大努力通知 | 最终一致 | 好 | 低 | 低 | 第三方回调 |
G3 2PC(强一致)
两阶段:
- Prepare:协调者问所有参与者”能否提交”,参与者锁资源回 Yes/No
- Commit/Rollback:全部 Yes → Commit;任一 No → Rollback
缺点:
- 同步阻塞
- 协调者单点
- 脑裂(部分参与者 Commit 部分未收到)
G4 TCC(业务侵入)
- Try:预留资源(如冻结余额)
- Confirm:实际提交(扣减冻结)
- Cancel:回滚(解冻)
优点:性能好(无全局锁) 缺点:业务侵入大(每接口需写 3 版本)
G5 Saga(长事务)
- 把长事务拆为一系列短事务 T1, T2, …, Tn
- 每个短事务有对应补偿事务 C1, C2, …, Cn
- 失败时反向执行已成功事务的补偿
适用:旅行预订(订机票→订酒店→租车,任一失败都需补偿)
G6 本地消息表
业务表更新 + 消息表插入(同一本地事务)→ 消息发送(异步)
失败重试 → 消息接收方幂等处理
优点:实现简单、可靠 缺点:消息表需维护
G7 Seata 4 模式(必考)
| 模式 | 原理 | 一致性 | 业务侵入 | 适用 |
|---|---|---|---|---|
| AT 模式(默认) | 自动二阶段 + undo_log 回滚 | 最终一致(弱) | 无(自动) | 大多数业务 |
| TCC 模式 | 手动 Try/Confirm/Cancel | 最终一致 | 大 | 高并发金融 |
| Saga 模式 | 长流程 + 补偿 | 最终一致 | 中 | 业务流程长 |
| XA 模式 | 依赖 DB XA | 强一致 | 无 | 数据库层 |
G8 Seata 三角色
| 角色 | 说明 |
|---|---|
| TC Transaction Coordinator | 事务协调者(独立部署,Seata-Server) |
| TM Transaction Manager | 事务管理器(发起方,标注 @GlobalTransactional) |
| RM Resource Manager | 资源管理器(每个微服务,管理本地资源) |
G9 选型决策树
IMPORTANT
分布式事务选型决策树 callout:
强一致 → XA / 2PC(性能差,少用)
高并发金融最终一致 → TCC(业务侵入大)
长流程业务 → Saga(补偿)
简单跨服务异步 → 本地消息表 / 事务消息
第三方回调 → 最大努力通知
默认推荐 → Seata AT(无侵入)
G10 真题举一反三
2024-11 论文:论分布式事务及其解决方案
- 解:需覆盖 2PC、TCC、Saga、本地消息表、Seata
2025-11 综合:Saga 相比 TCC 的特点?
- 解:Saga 无需冻结状态,靠补偿;适合长流程
H. 消息队列
H1 主流 MQ 对比
| MQ | 厂商 | 特点 | 适用 |
|---|---|---|---|
| Kafka | LinkedIn/Apache | 高吞吐、日志、流处理、分区有序 | 大数据、日志、流 |
| RocketMQ | 阿里/Apache | 事务消息、金融级、低延迟 | 电商交易 |
| RabbitMQ | Erlang | 路由丰富、AMQP | 业务消息、复杂路由 |
| Pulsar | Apache | 计算/存储分离、多租户 | 云原生 |
H2 消息可靠性
| 维度 | 机制 |
|---|---|
| 生产端 | 同步发送确认 / 异步回调 / 失败重试 |
| 存储 | 持久化(写盘 + 副本) |
| 消费端 | 手动 ACK;失败重试 / 死信队列 DLQ |
| 顺序性 | 单分区;业务 key 哈希到同分区 |
H3 三种消息语义
| 语义 | 说明 | 实现 |
|---|---|---|
| at-most-once 至多一次 | 可能丢失 | 发即忘 |
| at-least-once 至少一次 | 可能重复 | ACK + 重试 |
| exactly-once 精确一次 | 不丢不重 | 幂等生产 + 事务(Kafka 0.11+) |
H4 MQ 三大作用
- 削峰:突发流量入队,消费端按自己节奏处理
- 解耦:生产者不需要知道消费者
- 异步:非核心流程异步处理(发短信、记日志)
H5 真题举一反三
IMPORTANT
2023-11 案例:电商下单后库存扣减失败如何兜底 答:使用 RocketMQ 事务消息 + 本地消息表 + 消费者幂等;半消息 → 本库事务 → commit/rollback → 消费端失败重试 + 死信队列。
NOTE
2024-05 综合:以下关于 Kafka exactly-once 正确的是 B. 通过幂等 Producer + 事务实现。0.11+ 引入事务语义;其余选项常考分区有序、Consumer Group 再平衡。
I. 配置中心
I1 主流配置中心
| 实现 | 厂商 | 特点 |
|---|---|---|
| Apollo | 携程 | 实时推送(HTTP 长轮询)、多环境、灰度发布 |
| Nacos | 阿里 | 注册+配置一体化、AP/CP 切换 |
| Spring Cloud Config | Pivotal | 基于 Git/SVN,需配合 Bus 推送 |
I2 配置推送机制
- 长轮询 Long Polling(Apollo):客户端请求挂起,服务端有变更立即返回
- 推送 Push:服务端主动推(需保持长连接)
- 拉取 Pull:客户端定时拉取(延迟大)
I3 真题举一反三
IMPORTANT
2024-11 案例:微服务多环境配置热更新方案 推荐 Nacos/Apollo:①支持热更新(无需重启)②支持灰度/回滚 ③支持多环境隔离(dev/test/prod)④权限审计。
J. 链路追踪与可观测性
J1 OpenTracing / OpenTelemetry
- OpenTracing:调用链标准(已合并入 OpenTelemetry)
- OpenTelemetry:CNCF 标准,统一指标 + 日志 + 链路
J2 核心概念
| 概念 | 含义 |
|---|---|
| Trace | 一次完整请求链路 |
| Span | 一次操作(Trace 含多 Span) |
| Context | 跨服务传播(HTTP Header / RPC Context) |
J3 主流实现
| 实现 | 特点 |
|---|---|
| SkyWalking(Apache,国产) | 字节码注入、Java Agent、UI 强大 |
| Zipkin | Twitter 开源、轻量 |
| Jaeger | CNCF、Uber 开源 |
J4 可观测性三支柱
- 日志 Logging:事件记录(ELK / Loki)
- 指标 Metrics:数值聚合(Prometheus)
- 链路 Tracing:请求路径(SkyWalking)
J5 真题举一反三
NOTE
2024-05 综合:可观测性三支柱是 日志 + 指标 + 链路。三者配合实现”故障发现→定位→根因”闭环。
K. 服务网格 Service Mesh
K1 Sidecar 模式
Pod:
├─ 业务容器(应用代码)
└─ Sidecar 容器(Envoy,代理所有进出流量)
- 业务代码无感知网络(无 SDK)
- 所有流量经 Sidecar,可统一治理
K2 数据面 + 控制面
| 平面 | 实现 | 职责 |
|---|---|---|
| 数据面 Data Plane | Envoy / Linkerd-proxy | 实际流量代理(路由/负载/熔断) |
| 控制面 Control Plane | Istiod / Linkerd | 配置下发、证书管理、策略 |
K3 Istio 核心能力
| 能力 | 说明 |
|---|---|
| 流量管理 | 路由规则、负载、灰度(VirtualService + DestinationRule) |
| 安全 | mTLS 双向认证、授权策略 |
| 可观测 | 指标、链路、访问日志 |
| 策略执行 | 限流、熔断(与 SDK 解耦) |
K4 Service Mesh vs SDK 模式
| 维度 | SDK | Service Mesh |
|---|---|---|
| 侵入性 | 高(业务代码依赖) | 无(Sidecar) |
| 语言 | 单语言 | 多语言 |
| 升级 | 改业务代码重发 | 改 Sidecar 即可 |
| 性能 | 直接 | 多一跳(Sidecar) |
K5 真题举一反三
2025-05 综合:Service Mesh 的核心模式?
- 解:Sidecar 模式(数据面与业务容器同 Pod)
L. 反查表
| 考点 | 关键对比 | 真题 | 锚点 |
|---|---|---|---|
| 单体 vs 微服务 | 部署/扩展/数据 | 2024-11 论文 | §A |
| DDD 限界上下文 | 服务边界 | 2025-05 案例 | §A2 |
| 注册中心 CAP | ZK=CP / Eureka=AP | 2022-11, 2025-11 | §B |
| Eureka 自我保护 | 心跳丢失 85% 不剔除 | 2023-11 | §B |
| 网关功能 | 路由/鉴权/限流/熔断 | 2023-11 | §C |
| 熔断器三态 | Closed/Open/Half-Open | 2024-05, 2025-11 | §D |
| 熔断 vs 降级 vs 限流 | 断保护/牺牲非核心/拒部分 | 2025-11 | §D3 |
| 漏桶 vs 令牌桶 | 不允许突发 vs 允许 | 2021-11, 2024-11 | §E |
| 滑动窗口优势 | 降低临界问题 | 2024-11 | §E |
| 一致性哈希 | 环空间 + 虚拟节点 | 2023-05, 2025-05 | §F |
| L4 vs L7 | 端口 vs URL/Header | 综合 | §F |
| 2PC 缺点 | 阻塞/单点/脑裂 | 2022-05 | §G3 |
| TCC 业务侵入 | Try/Confirm/Cancel | 2024-11 论文 | §G4 |
| Saga 补偿 | 长流程反向补偿 | 2025-11 | §G5 |
| 本地消息表 | 业务+消息同事务 | 2024-11 论文 | §G6 |
| Seata 4 模式 | AT/TCC/Saga/XA | 2024-11 论文 | §G7 |
| Seata 三角色 | TC/TM/RM | 2025-11 | §G8 |
| Kafka vs RocketMQ | 高吞吐 vs 事务 | 综合 | §H |
| 三种消息语义 | at-most/least/exactly-once | 2024-05 | §H3 |
| Apollo 长轮询 | 实时推送 | 综合 | §I |
| 可观测三支柱 | 日志/指标/链路 | 2025-11 | §J4 |
| SkyWalking | Java Agent 字节码注入 | 综合 | §J3 |
| Service Mesh Sidecar | 数据面与业务同 Pod | 2025-05 | §K |
| Istio 控制面 | Istiod | 综合 | §K2 |
记忆口诀 / 易错点汇总
- CAP 选型:ZK=CP,Eureka=AP,Nacos=AP/CP 可切
- 熔断 vs 降级 vs 限流:断/弃/拒
- 限流:固定→临界;滑动→平滑;漏桶→恒速;令牌桶→突发
- 一致性哈希:环 + 顺时针 + 虚拟节点
- 分布式事务:强一致→2PC/XA;最终一致→TCC/Saga/消息表
- Seata 4 模式:AT 默认 / TCC 高并发 / Saga 长流程 / XA 强一致
- Service Mesh:Sidecar + 数据面 + 控制面
TIP
避坑建议:
- 熔断 ≠ 降级 ≠ 限流——三者区分必考
- 漏桶 vs 令牌桶核心差异是”是否允许突发”
- TCC 业务侵入大,需为每接口写 3 版本
- Saga 与 TCC 区别:Saga 无冻结状态,靠补偿
交叉引用
本系列笔记
- 新技术 Web 架构速查表:微服务概念速查
- 架构风格详讲:微服务作为一种架构风格
- 云原生大数据AI深化:K8s / DevOps / CAP 详解
- 论文素材库:微服务论文段落
主计划文档
详见 主计划 §3.9 新技术与 Web 架构 的对应内容。
外部延伸
- 官方教材:《系统架构设计师教程(第 2 版)》§3.9
- 经典著作:Sam Newman《Building Microservices》《Microservices Patterns》
- 真题练习:2020-2025 综合+案例+论文
自测题
- CAP:ZooKeeper/Eureka/Nacos 分别属于哪类?(答:CP/AP/AP-CP 可切)
- 限流:突发流量应选漏桶还是令牌桶?(答:令牌桶)
- 熔断:Hystrix 熔断器三态及其转换条件?
- 分布式事务:TCC 三个阶段是什么?相比 Saga 的优劣?
- Seata:4 种模式与适用场景?
- Service Mesh:Sidecar 模式与 SDK 模式的区别?
IMPORTANT
如果只能”看着面熟”但说不出来,说明还没真正掌握,建议回看对应章节并多做真题。
下一篇导引:云原生 + 大数据 + AI + 区块链深化 将讲述 Docker / K8s 全组件 / Serverless / Spark-Flink / 湖仓一体 / CAP / AI / 区块链,覆盖 2024-2025 命题新趋势。