目录
[微服务保护和分布式事务 - 01. 雪崩问题 - 原因分析](#微服务保护和分布式事务 - 01. 雪崩问题 - 原因分析)
[微服务保护和分布式事务 - 02. 雪崩问题 - 解决方案](#微服务保护和分布式事务 - 02. 雪崩问题 - 解决方案)
[微服务保护和分布式事务 - 03.Sentinel - 快速入门](#微服务保护和分布式事务 - 03.Sentinel - 快速入门)
[它主要干 4 件事(面试 + 工作必背)](#它主要干 4 件事(面试 + 工作必背))
[1. 限流(控制 QPS)](#1. 限流(控制 QPS))
[2. 线程隔离 / 降级](#2. 线程隔离 / 降级)
[3. 熔断(断路器)](#3. 熔断(断路器))
[4. 热点参数限流、系统保护](#4. 热点参数限流、系统保护)
[微服务保护和分布式事务 - 04.Sentinel - 请求限流](#微服务保护和分布式事务 - 04.Sentinel - 请求限流)
[微服务保护和分布式事务 - 05.Sentinel - 线程隔离](#微服务保护和分布式事务 - 05.Sentinel - 线程隔离)
[微服务保护和分布式事务 - 06.Sentinel-Fallback](#微服务保护和分布式事务 - 06.Sentinel-Fallback)
[微服务保护和分布式事务 - 07.Sentinel - 服务熔断](#微服务保护和分布式事务 - 07.Sentinel - 服务熔断)
[微服务保护和分布式事务 - 08. 分布式事务 - 什么是分布式事务](#微服务保护和分布式事务 - 08. 分布式事务 - 什么是分布式事务)
[微服务保护和分布式事务 - 09. 分布式事务 - Seata 的架构和原理](#微服务保护和分布式事务 - 09. 分布式事务 - Seata 的架构和原理)
[微服务保护和分布式事务 - 10. 分布式事务 - 部署 TC服务](#微服务保护和分布式事务 - 10. 分布式事务 - 部署 TC服务)
[问题:defaultConfiguration = DefaultFeignConfig.class这个有什么用?](#问题:defaultConfiguration = DefaultFeignConfig.class这个有什么用?)
[微服务保护和分布式事务 - 11. 分布式事务 - 微服务整合Seata](#微服务保护和分布式事务 - 11. 分布式事务 - 微服务整合Seata)
[微服务保护和分布式事务 - 12. 分布式事务 - XA 模式](#微服务保护和分布式事务 - 12. 分布式事务 - XA 模式)
[微服务保护和分布式事务 - 13. 分布式事务 - AT 模式原理](#微服务保护和分布式事务 - 13. 分布式事务 - AT 模式原理)
[微服务保护和分布式事务 - 14. 分布式事务 - AT 模式的使用](#微服务保护和分布式事务 - 14. 分布式事务 - AT 模式的使用)
微服务保护和分布式事务 - 01. 雪崩问题 - 原因分析


微服务保护和分布式事务 - 02. 雪崩问题 - 解决方案






微服务保护和分布式事务 - 03.Sentinel - 快速入门
问题:Sentinel组成?
Sentinel 的使用可以分为两个部分:
核心库(Jar包):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。在项目中引入依赖即可实现服务限流、隔离、熔断等功能。
控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。
问题:什么是簇点链路
问题:什么是QPS?
QPS = Queries Per Second 意思是:每秒能处理的请求数量
问题:限制QPS和并发线程数有什么区别?
Sentinel 是保护微服务不雪崩、不宕机、不乱套的工具
它主要干 4 件事(面试 + 工作必背)
1. 限流(控制 QPS)
- 控制每秒最多进来多少请求
- 超过阈值直接拒绝,防止服务被冲垮
- 比如:限制接口 QPS = 200
2. 线程隔离 / 降级
- 给不同接口分配独立线程池
- 一个接口慢、卡死,不会拖垮整个服务
- 避免服务雪崩
3. 熔断(断路器)
- 发现某个下游服务一直报错、响应慢
- 直接切断调用,不再访问它
- 等恢复后再自动放开,防止雪崩
4. 热点参数限流、系统保护
- 针对某个用户、某个商品 ID 限流
- 防止恶意刷接口、爬虫爬垮服务
微服务保护和分布式事务 - 04.Sentinel - 请求限流
微服务保护和分布式事务 - 05.Sentinel - 线程隔离



微服务保护和分布式事务 - 06.Sentinel-Fallback
问题:为什么需要下图那一步?
因为默认情况下,
Sentinel会监控SpringMVC的每一个Endpoint(接口)。



问题:如何将一个类定义成bean?
微服务保护和分布式事务 - 07.Sentinel - 服务熔断


微服务保护和分布式事务 - 08. 分布式事务 - 什么是分布式事务

微服务保护和分布式事务 - 09. 分布式事务 - Seata 的架构和原理


微服务保护和分布式事务 - 10. 分布式事务 - 部署 TC服务


问题:defaultConfiguration = DefaultFeignConfig.class这个有什么用?
等于让 Spring 加载了这个配置 → 于是创建了 Bean → 于是不报错了!
其实就是让spring去扫描这个配置类,然后加载里面的@Bean到容器中
微服务保护和分布式事务 - 11. 分布式事务 - 微服务整合Seata
问题:微服务怎么整合seata?
微服务保护和分布式事务 - 12. 分布式事务 - XA 模式





微服务保护和分布式事务 - 13. 分布式事务 - AT 模式原理

问题:AT模式和XA模式各自两个阶段的流程?
一、XA 模式两阶段提交(2PC)
XA 是数据库层面的强一致性事务,基于标准 2PC。
阶段一:prepare(准备阶段 / 投票阶段)
事务协调者向所有参与者发送 prepare 请求
各参与者执行本地事务,但不提交
参与者回复协调者:
成功 → YES
失败 → NO
阶段二:commit/rollback(提交 / 回滚阶段)
所有参与者都 YES → 协调者发送 commit,所有库提交
任意一个 NO 或超时 → 协调者发送 rollback,全部回滚
二、AT 模式两阶段(Seata 自动模式)
AT 是业务无侵入的最终一致性,Seata 自动代理数据源。
阶段一:一阶段(执行 + undo/redo 日志)
- 执行业务 SQL
- 自动生成前镜像(before)和后镜像(after)
- 注册分支事务到 TC
- 本地事务提交(这点和 XA 完全不同)
- 报告状态给 TC
阶段二:二阶段(异步提交 / 回滚)
情况 1:全局提交
- TC 发送全局提交命令
- 异步删除 undo log
- 不阻塞业务,无数据库锁
情况 2:全局回滚
- TC 发送回滚命令
- 根据 before 镜像 自动生成回滚 SQL
- 恢复数据,实现自动回滚
问题:AT模式和XA模式的区别?
微服务保护和分布式事务 - 14. 分布式事务 - AT 模式的使用

问题:改造使用seata的步骤?
seata是管理分布式事务的
流程:
2.3.1.引入依赖
为了方便各个微服务集成seata,我们需要把seata配置共享到nacos,因此
trade-service模块不仅仅要引入seata依赖,还要引入nacos依赖:
XML<!--统一配置管理--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--读取bootstrap文件--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <!--seata--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> </dependency>2.3.2.改造配置
首先在nacos上添加一个共享的seata配置,命名为
shared-seata.yaml:
XMLseata: registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址 type: nacos # 注册中心类型 nacos nacos: server-addr: 192.168.150.101:8848 # nacos地址 namespace: "" # namespace,默认为空 group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUP application: seata-server # seata服务名称 username: nacos password: nacos tx-service-group: hmall # 事务组名称 service: vgroup-mapping: # 事务组与tc集群的映射关系 hmall: "default"然后,改造
trade-service模块,添加bootstrap.yaml:
XMLspring: application: name: trade-service # 服务名称 profiles: active: dev cloud: nacos: server-addr: 192.168.150.101 # nacos地址 config: file-extension: yaml # 文件后缀名 shared-configs: # 共享配置 - dataId: shared-jdbc.yaml # 共享mybatis配置 - dataId: shared-log.yaml # 共享日志配置 - dataId: shared-swagger.yaml # 共享日志配置 - dataId: shared-seata.yaml # 共享seata配置可以看到这里加载了共享的seata配置。
然后改造application.yaml文件,内容如下:
XMLserver: port: 8085 feign: okhttp: enabled: true # 开启OKHttp连接池支持 sentinel: enabled: true # 开启Feign对Sentinel的整合 hm: swagger: title: 交易服务接口文档 package: com.hmall.trade.controller db: database: hm-trade2.3.3.添加数据库表
seata的客户端在解决分布式事务的时候需要记录一些中间数据,保存在数据库中。因此我们要先准备一个这样的表。
将课前资料的seata-at.sql分别文件导入hm-trade、hm-cart、hm-item三个数据库中:
2.3.4.测试
接下来就是测试的分布式事务的时候了。
我们找到
trade-service模块下的com.hmall.trade.service.impl.OrderServiceImpl类中的createOrder方法,也就是下单业务方法。将其上的
@Transactional注解改为Seata提供的@GlobalTransactional:
@GlobalTransactional注解就是在标记事务的起点,将来TM就会基于这个方法判断全局事务范围,初始化全局事务。我们重启
trade-service、item-service、cart-service三个服务。再次测试,发现分布式事务的问题解决了!那么,Seata是如何解决分布式事务的呢?
默认是AT模式
问题:微服务整合Sentinel流程?
Sentinel是阿里巴巴开源的一款服务保护框架,是对微服务的服务器进行保护的
首先得在docker环境中部署Sentinel
3)访问
cart-service的任意端点重启
cart-service,然后访问查询购物车接口,sentinel的客户端就会将服务访问的信息提交到sentinel-dashboard控制台。并展示出统计信息:然后就可以进行请求限流,线程隔离和服务熔断这三种方式了
问题:OpenFeign怎么整合Sentinel?
问题:怎么编写熔断降级?
javapackage com.hmall.api.client.fallback; import com.hmall.api.client.ItemClient; import com.hmall.api.dto.ItemDTO; import com.hmall.api.dto.OrderDetailDTO; import com.hmall.common.exception.BizIllegalException; import com.hmall.common.utils.CollUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.openfeign.FallbackFactory; import java.util.Collection; import java.util.List; @Slf4j public class ItemClientFallback implements FallbackFactory<ItemClient> { @Override public ItemClient create(Throwable cause) { return new ItemClient() { @Override public List<ItemDTO> queryItemByIds(Collection<Long> ids) { log.error("远程调用ItemClient#queryItemByIds方法出现异常,参数:{}", ids, cause); // 查询购物车允许失败,查询失败,返回空集合 return CollUtils.emptyList(); } @Override public void deductStock(List<OrderDetailDTO> items) { // 库存扣减业务需要触发事务回滚,查询失败,抛出异常 throw new BizIllegalException(cause); } }; } }



















