Setinel流控、服务熔断、服务降级和seate分布式事务处理

一、Setinel

1.什么是sentinel?

sentinel在 springcloud Alibaba 中的作用是实现熔断和限流。类似于Hystrix豪猪。

2.sentinel有啥用

服务雪崩、服务降级、服务熔断、服务限流

3.sentinel的主要特性

在这里插入图片描述

4.sentinel启动

条件:安装sentinel、JDK8环境、8080端口未被占用
到sentinel的安装目录下,使用java -jar sentinel-dashboard-1.8.3.jar启动。浏览器访问localhost:8080,用户名和密码都是sentinel。
在这里插入图片描述

5.sentinel初始化监控

新建cloudalibaba-sentinel-service8401
(1)pom.xml

<dependencies>
    <!-- 后续做Sentinel的持久化会用到的依赖 -->
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-datasource-nacos</artifactId>
    </dependency>
    <!-- sentinel  -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
    <!-- springcloud alibaba nacos 依赖,Nacos Server 服务注册中心 -->
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>

    <!-- springboot整合Web组件 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <!-- 日常通用jar包 -->
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <scope>runtime</scope>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

(2)application.yml

server:
  port: 8401
spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        # nacos服务注册中心地址
        server-addr: localhost:8848
    sentinel:
      transport:
        # 配置sentinel dashboard地址
        dashboard: localhost:8080
        # 默认8719端口,加入被占用会自动从8719每次加1扫描,直到扫描未被占用的端口
        port: 8719
management:
  endpoints:
    web:
      exposure:
        include: '*' # 监控的东西

(3)业务控制类

@RestController
public class SentinelController {
    
    
    @GetMapping("/testA")
    public String testA(){
    
    
        return "testA-----";

    }
    @GetMapping("testB")
    public String testB(){
    
    
        return "testB-----";
    }
}

(4)主启动类

@SpringBootApplication
@EnableDiscoveryClient
public class SentinelMain8401 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(SentinelMain8401.class,args);
    }
}

启动Nacos,启动sentinel,启动8401微服务后台查看sentinel控制台
你会发现什么也没有,因为sentinel采用的是懒加载机制,执行访问一次即可监控到。

二、流控

1.各种流控规则

在这里插入图片描述

2.重要属性

在这里插入图片描述

3.编辑流控规则

在这里插入图片描述

1.流控模式

1.1 直接失败
直接:当api达到限流条件时,直接限流自己。
QPS直接失败和线程数直接失败的区别:
QPS 类似于银行的保安 :所有的请求到Sentinel 后,他会根据阈值放行,超过报错
线程数类似于银行的窗口:所有的请求会被放进来,但如果阈值设置为1 那么,其他的请求就会报错也就是,银行里只有一个窗口,一个人在办理业务中,其他人跑过来则会告诉你,不行,没到你
1.2 关联
关联:当关联的资源达到阈值时,就限流自己。
举个栗子:支付接口达到阈值,就限流下订单接口,防止连坐效应。
1.3 链路

2.流控效果

2.1 快速失败
直接—>快速失败(默认的流控处理)
2.2 Warmup(预热)
在这里插入图片描述
举个栗子:秒杀系统在刚开始的一瞬间,会有很多的请求打进来,Warmup(预热)可以保护系统,使请求慢慢增加,防止系统挂掉。
2.3 排队等待
在这里插入图片描述
在这里插入图片描述

3.降级

Sentinel熔断降级会在调用链路中某个资源出现不稳定的状态时(例如调用超时或异常比例升高)。对这个资源的调用进行限制,让请求快速失败,避免影响到其他的资源而导致级联错误。
当资源降级后,在接下来的降级时间窗口之内,对该资源的调用都会自动熔断
Sentineld的熔断器没有半开的状态,Hystrix存在半开状态
半开的状态系统自动去检测是否请求异常,没有异常就关闭断路器恢复异常,有异常则继续打开断路器不可用
在这里插入图片描述
在这里插入图片描述
3.1 RT(平均响应时间)
在这里插入图片描述
平均响应时间(DEGRADE_GRADE_RT):当一秒内持续进入5个请求,对应时刻的平均响应时间(秒级)均超过阀值(毫秒为单位)那么在接下来的时间窗口(秒为单位)内对这个方法的调用都会自动熔断。注意:RT最大4900(更大的需要通过-Dcsp.Sentinel.statistic.max.rt=XXXX才能生效)
在这里插入图片描述
3.2 异常比例
异常比例(DEGRADE-GRADE-EXCEPTION-RATIO):当资源的每秒请求量>=5,并且每秒异常总数占通过的比值超过阈值(DegradeRule中的count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRu1e中的timeWindow,,以s为单位)之内,对这个方法的调用都会自动地返回。异常b阈值范围是[0.0,l.0],代表0%一100%。
在这里插入图片描述
在这里插入图片描述
3.3 异常数
异常数:当资源接近一分钟的异常数目超过超过阀值之后会进行熔断。注意由于统计时间的窗口是分钟级别的,若timeWindow小于60s,则结束熔断后仍可能进入熔断状态(时间窗口一定要大于等于60秒)
在这里插入图片描述
在这里插入图片描述

4.热点key限流

4.1 何为热点?
热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的TopK数据,并对其访问进行限制。比如:

  • 商品ID为参数,统计一段时间内最常购买的商品ID并进行限制
  • 用户ID为参数,针对一段时间内频繁访问的用户ID进行限制

参数限流会统计传入参数中的参数,并根据配置流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
兜底方法分为系统默认和客户自定义两种,之前的case,限流出问题后,都是用sentinel系统默认的提示Blocked by Sentinel (flow limiting),我们可以定义一个类似于hystrix,某个方法出问题后找到对应的兜底方法
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4.2 参数例外项
上述案例演示了第一个参数p1,当QPS超过一秒一次点击后马上限流,但我们期望p1的参数当他是某个特殊值时,他的限流和平时不一样,假如当p1等于5时,他的阀值可以达到10
在这里插入图片描述
说明:
@SentinelResource :处理的是Sentine1控制台配置的违规情况,有blockHandler方法配置的兜底处理
@RuntimeException:int age=10/0,这个是java运行时报出的运行时异常RunTimeException,@Sentine1Resource不管

5.系统规则

5.1 系统自适应限流
Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
5.2 系统规则支持以下的模式

  • Load自适应:系统的load作为启发的指标,进行自适应系统保护,当系统的load超过预定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR阶段),系统容量由系统的maxQPSminRT估算得出,设定参考值一般为CPU cores2.5
  • CPU usage(1.5.0+版本):当系统CPU的使用率超过阈值即触发保护系统(取值范围0.0-1.0),比较灵敏
  • 平均RT:当单台机器上所有入口流量的平均RT达到阀值即触发保护系统,单位是毫秒
  • 并发线程数:当单台机器上所有入口流量的并发线程数达到阀值即触发保护系统
  • 入口QPS:当单台机器上所有入口流量的QPS达到阀值即触发保护系统

在这里插入图片描述

6.服务熔断

fallback负责业务异常
blockHandler值赋值控制台sentinel配置违规
@SentinelResource(value = “fallback”,fallback =“handlerFallback”,blockHandler = “blockHandler”)若block和Handler都进行就配置,则被迫降级而报出的BlockException是只会进入blockHandler处理逻辑

7.sentinel持久化

将限流配置规则持久化建nacos保存,只要刷新某个rest地址,sentinel控制台的流控规则就能看到,只要nacos里面的配置不删除,sentinel的流控规则持久有效。
目前的sentinel 当重启以后,数据都会丢失,和 nacos 类似原理。需要持久化。它可以被持久化到nacos 的数据库中。

三、分布式事务

分布式面临的事务问题

单体应用被拆分成微服务应用,原来的三个模块被拆分成三个独立的应用,分别使用三个独立的数据源。
业务操作需要调用三个服务来完成。此时每个服务内部的数据一致性由本地事务来保证,但是全局的数据一致性问题没法保证。
在这里插入图片描述

1.什么是seata?

seate是一款开源的分布式事务解决方案,致力于微服务构架下提供高性能和简单易用的分布式事务服务。

2.seata的组成

seate是一个典型的分布式事务处理过程,由一个ID和三组件模型组成
一个ID:全局唯一的事务ID
三组件:
① TC (Transaction Coordinator) - 事务协调者:维护全局和分支事务的状态,驱动全局事务提交或回滚。
② TM (Transaction Manager) - 事务管理器:定义全局事务的范围:开始全局事务、提交或回滚全局事务。
③ RM (Resource Manager) - 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

3.处理过程

在这里插入图片描述
在这里插入图片描述

4.seata的下载使用

seata的下载使用

参考技术博客:

尚硅谷SpringCloud Alibaba

猜你喜欢

转载自blog.csdn.net/weixin_46081857/article/details/123740626