SpringCloud_day05

目录

[微服务保护和分布式事务 - 01. 雪崩问题 - 原因分析](#微服务保护和分布式事务 - 01. 雪崩问题 - 原因分析)

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

[微服务保护和分布式事务 - 03.Sentinel - 快速入门](#微服务保护和分布式事务 - 03.Sentinel - 快速入门)

问题:Sentinel组成?

问题:什么是簇点链路

问题:什么是QPS?

问题:限制QPS和并发线程数有什么区别?

[它主要干 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)

问题:为什么需要下图那一步?

问题:如何将一个类定义成bean?

[微服务保护和分布式事务 - 07.Sentinel - 服务熔断](#微服务保护和分布式事务 - 07.Sentinel - 服务熔断)

[微服务保护和分布式事务 - 08. 分布式事务 - 什么是分布式事务](#微服务保护和分布式事务 - 08. 分布式事务 - 什么是分布式事务)

[微服务保护和分布式事务 - 09. 分布式事务 - Seata 的架构和原理](#微服务保护和分布式事务 - 09. 分布式事务 - Seata 的架构和原理)

[微服务保护和分布式事务 - 10. 分布式事务 - 部署 TC服务](#微服务保护和分布式事务 - 10. 分布式事务 - 部署 TC服务)

[问题:defaultConfiguration = DefaultFeignConfig.class这个有什么用?](#问题:defaultConfiguration = DefaultFeignConfig.class这个有什么用?)

[微服务保护和分布式事务 - 11. 分布式事务 - 微服务整合Seata](#微服务保护和分布式事务 - 11. 分布式事务 - 微服务整合Seata)

问题:微服务怎么整合seata?

[微服务保护和分布式事务 - 12. 分布式事务 - XA 模式](#微服务保护和分布式事务 - 12. 分布式事务 - XA 模式)

[微服务保护和分布式事务 - 13. 分布式事务 - AT 模式原理](#微服务保护和分布式事务 - 13. 分布式事务 - AT 模式原理)

问题:AT模式和XA模式各自两个阶段的流程?

问题:AT模式和XA模式的区别?

[微服务保护和分布式事务 - 14. 分布式事务 - AT 模式的使用](#微服务保护和分布式事务 - 14. 分布式事务 - AT 模式的使用)

问题:改造使用seata的步骤?

2.3.1.引入依赖

2.3.2.改造配置

2.3.3.添加数据库表

2.3.4.测试

问题:微服务整合Sentinel流程?

问题:OpenFeign怎么整合Sentinel?

问题:怎么编写熔断降级?

末尾页


微服务保护和分布式事务 - 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(准备阶段 / 投票阶段)

  1. 事务协调者向所有参与者发送 prepare 请求

  2. 各参与者执行本地事务,但不提交

  3. 参与者回复协调者:

    • 成功 → YES

    • 失败 → NO

阶段二:commit/rollback(提交 / 回滚阶段)

  • 所有参与者都 YES → 协调者发送 commit,所有库提交

  • 任意一个 NO 或超时 → 协调者发送 rollback,全部回滚


二、AT 模式两阶段(Seata 自动模式)

AT 是业务无侵入的最终一致性,Seata 自动代理数据源。

阶段一:一阶段(执行 + undo/redo 日志)

  1. 执行业务 SQL
  2. 自动生成前镜像(before)后镜像(after)
  3. 注册分支事务到 TC
  4. 本地事务提交(这点和 XA 完全不同)
  5. 报告状态给 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

XML 复制代码
seata:
  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

XML 复制代码
spring:
  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文件,内容如下:

XML 复制代码
server:
  port: 8085
feign:
  okhttp:
    enabled: true # 开启OKHttp连接池支持
  sentinel:
    enabled: true # 开启Feign对Sentinel的整合
hm:
  swagger:
    title: 交易服务接口文档
    package: com.hmall.trade.controller
  db:
    database: hm-trade

2.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-serviceitem-servicecart-service三个服务。再次测试,发现分布式事务的问题解决了!

那么,Seata是如何解决分布式事务的呢?

默认是AT模式

问题:微服务整合Sentinel流程?

Sentinel是阿里巴巴开源的一款服务保护框架,是对微服务的服务器进行保护的

首先得在docker环境中部署Sentinel

3)访问cart-service的任意端点

重启cart-service,然后访问查询购物车接口,sentinel的客户端就会将服务访问的信息提交到sentinel-dashboard控制台。并展示出统计信息:

然后就可以进行请求限流,线程隔离和服务熔断这三种方式了

问题:OpenFeign怎么整合Sentinel?

问题:怎么编写熔断降级?

java 复制代码
package 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);
            }
        };
    }
}

末尾页

相关推荐
ServBay2 小时前
阿里超强编程模型Qwen 3.6 -Plus 发布,国产编程AI的春天?
后端·ai编程
用户8356290780512 小时前
使用 Python 自动生成 Excel 柱状图的完整指南
后端·python
希望永不加班2 小时前
SpringBoot 静态资源访问(图片/JS/CSS)配置详解
java·javascript·css·spring boot·后端
Soofjan2 小时前
Go 内存管理(3):内存分配源码
后端
元宝骑士3 小时前
深度解析 ROW_NUMBER() 窗口函数:从入门到实战避坑指南
后端·mysql
段小二3 小时前
Token 费用失控、VIP 用户体验一样烂:Context Engineering 才是关键
人工智能·后端
Nyarlathotep01133 小时前
并行设计模式(3):Future模式
java·后端
秋风不问归客3 小时前
Springboot面试全面整理
spring boot·后端·面试
鬼先生_sir4 小时前
SpringCloud-GateWay网关
java·spring cloud·gateway