黑马商城 · DAY 02 学习页

微服务出问题怎么办?
跨数据库的数据怎么一起回滚?

今天只抓住两条主线:Sentinel 保护服务,Seata 保护数据。从你熟悉的购物车、下单和余额支付出发,读完做一遍小测,能把 Day02 的核心内容讲给别人听。

01 / 先建立全局认识

今天学的,其实是两种“别出大事”

先看一遍,不用记术语。

服务能否继续用

Sentinel:给服务装保险丝

商品服务卡住时,别把购物车、订单服务也拖死。

它负责限流、熔断、降级、线程隔离,防止一个故障扩散成整个系统的故障。

数据是否保持一致

Seata:给多个数据库绑在一起

下单做到一半失败,已经扣掉的库存要还回去。

它负责跨服务事务,让订单、库存、购物车等数据库操作一起成功或一起撤销。

一句话分清:Sentinel 解决“服务还能不能扛住”,Seata 解决“数据会不会只改一半”。
02 / 微服务保护

从一次购物车查询理解 Sentinel

假设用户点开购物车,购物车服务需要向商品服务查询最新价格。

用户打开购物车
→
cart-service
→
item-service 查询价格
雪崩怎么发生?商品服务响应很慢 → 购物车请求都在等 → 购物车线程被占满 → 更多请求也开始排队 → 依赖购物车的服务一起变慢。一个点的故障沿调用链扩散,就是“微服务雪崩”。

四个保护办法,用人话来记

办法像什么在商城里做什么
限流景区入口每秒只放一批人限制每秒请求数(QPS)。超出的请求立刻处理为“系统繁忙”,不再挤进去。
线程隔离给某个窗口限定工作人员限制“同时正在处理”的请求数。商品服务再慢,也不能占光购物车服务的线程。
熔断电路总短路就先拉闸商品服务连续失败或很慢,暂时不再调用它;过一段时间尝试恢复。
降级主菜做不了,先上简餐查询商品失败时,购物车先显示已有条目,最新价格暂时为空。
最容易混淆

QPS 和并发线程数

QPS=5:每秒最多放行 5 次。
线程数=5:同一时刻最多 5 个请求在执行;只要结束得快,一秒可以处理超过 5 次。

最容易混淆

熔断和降级

熔断决定“还要不要继续调用商品服务”。
降级决定“调用不了时返回什么”。两者经常配合使用。

点一点击穿四种情况

代码对应关系:OpenFeign 调商品服务;FallbackFactory 给 Feign 调用准备降级结果;@SentinelResource 给普通接口设置异常兜底和限流/熔断处理。下单“扣库存”是关键操作,失败时必须抛错,不能假装成功。
03 / 分布式事务

普通事务为什么管不了三个数据库?

每个微服务都有自己的数据库,一个数据库的事务只能管自己。

交易库:写订单
→
商品库:扣库存
→
购物车库:减数量
危险情况:订单写好了,库存扣了,最后购物车操作失败。只靠交易服务里的 @Transactional,商品库已经提交的库存不会自动恢复,数据就对不上。

Seata 怎样帮忙?

  1. 交易服务开启一个全局事务,拿到事务编号 XID。
  2. 订单、商品、购物车服务各自完成本地操作,同时向 Seata 报告“我是这笔事务的一部分”。
  3. 全部成功 → 一起确认成功;任一步失败 → 通知已完成的服务回滚。

三个角色

TM:发起和结束整笔全局事务的人,像总指挥。

RM:每个数据库操作的参与者,负责执行和回滚。

TC:协调中心,记录哪些参与者加入,通知提交或回滚。

AT 模式

undo_log 是“后悔药”

Seata 在每个参与的业务库建 undo_log 表,保存修改前后的数据快照。全局事务失败时,利用它把已提交的本地数据改回去。

关键注解

@GlobalTransactional

加在下单、余额支付这样的“跨服务操作入口”上。各参与服务仍需正确执行本地数据库操作,并连接同一个 Seata 事务协调器。

注意:AT 模式适合普通关系型数据库操作。讲义还介绍 XA、TCC 等模式;现在先掌握 AT 的“记录快照、失败补偿”这条主线即可。
04 / 理解 CAP

网络断了,还能两全其美吗?

这是 Day02 的理论部分,记住场景比背字母有用。

C · 一致性

访问不同节点时,读到的数据要一致。

A · 可用性

请求来了,系统仍能给出响应。

P · 分区容错

节点之间的网络断开时,系统仍要面对这种情况。

核心取舍:当节点之间真的无法通信,系统通常要优先保证 P;此时很难同时保证严格一致和始终可用。可以暂时拒绝部分请求保一致,也可以继续响应但允许短时间数据不一致。
05 / 两项作业

把理论放到真实业务里

作业一

下单

交易服务建订单 → 商品服务扣库存 → 购物车服务按购买数量减少。原来购物车有 3 件,买 1 件后应该剩 2 件。任何一步失败,前面的修改都要回滚。

作业二

余额支付

用户服务扣余额 → 支付服务更新支付单 → 交易服务更新订单状态。不能出现“钱扣了,但订单仍未支付”。任何一步失败,都要回滚。

在这个项目里实际验证过:购物车服务停止时,下单失败且库存恢复;交易服务停止时,支付失败且用户余额恢复。详细记录在项目的 DAY02-VERIFICATION.md。
06 / 立即自测

能答对这些,就算掌握主线

先自己选,再点“批改”。答错也没关系,解释会告诉你为什么。

07 / 今天的收尾

用 20 分钟把知识串起来

复习清单

推荐学习顺序

前 5 分钟:复述两个大问题:服务雪崩与跨库数据不一致。

接着 8 分钟:不看表格,自己讲出四种 Sentinel 保护办法。

接着 5 分钟:画出下单三步和支付三步,指出失败后要回滚什么。

最后 2 分钟:完成左侧清单,再做一次小测。