19.Sentinel限流熔断

1.Sentinel概述

1.1是什么?

轻量级流量控制、熔断降级java库。一句话解释,之前我们讲解过的Hystrix
19.Sentinel限流熔断_第1张图片

1.2 安装Sentinel控制台

19.Sentinel限流熔断_第2张图片
19.Sentinel限流熔断_第3张图片下载jar: https://github.com/alibaba/Sentinel/releases
登录管理页面: http://localhost:8080

1.3新建Module cloudalibaba-sentinel-service8401
1.3.1改pom
    <dependencies>
        <dependency>
            <groupId>com.atguigu.springcloudgroupId>
            <artifactId>cloud-api-commonsartifactId>
            <version>${project.version}version>
        dependency>

        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>

        <dependency>
            <groupId>com.alibaba.cspgroupId>
            <artifactId>sentinel-datasource-nacosartifactId>
        dependency>

        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-openfeignartifactId>
        dependency>

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-actuatorartifactId>
        dependency>
      
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-devtoolsartifactId>
            <scope>runtimescope>
            <optional>trueoptional>
        dependency>
        <dependency>
            <groupId>cn.hutoolgroupId>
            <artifactId>hutool-allartifactId>
            <version>4.6.3version>
        dependency>
        <dependency>
            <groupId>org.projectlombokgroupId>
            <artifactId>lombokartifactId>
            <optional>trueoptional>
        dependency>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-testartifactId>
            <scope>testscope>
        dependency>
    dependencies>
1.3.2改yml
server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8719  #默认8719,假如被占用了会自动从8719开始依次+1扫描。直至找到未被占用的端口

management:
  endpoints:
    web:
      exposure:
        include: '*'
1.3.3 主启动与业务类
@EnableDiscoveryClient
@SpringBootApplication
public class MainApp8401
{
    public static void main(String[] args) {
        SpringApplication.run(MainApp8401.class, args);
    }
}
@RestController
public class FlowLimitController
{
    @GetMapping("/testA")
    public String testA() {
        return "------testA";
    }

    @GetMapping("/testB")
    public String testB() {

        return "------testB";
    }
}
1.3.4Sentinel的懒加载

启动Nacos8848成功,启动Sentinel8080,启动8401微服务

19.Sentinel限流熔断_第4张图片

2.流控模式

2.1 流控模式:

1)直接:对当前资源限流
2)关联:高优先级资源触发阈值,对低优先级资源限流。
3)链路:阈值统计时,只统计从指定资源进入当前资源的请求,是对请求来源的限流
19.Sentinel限流熔断_第5张图片19.Sentinel限流熔断_第6张图片

2.2 流控效果:

1)快速失败:直接失败,抛出异常 Blocked by Sentinel (flow limiting)
源码:com.alibaba.csp.sentinel.slots.block.flow.controller.DefaultController

2)Warm up(预热)
公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值
默认coldFactor为3,即请求QPS从threshold/3开始,经预热时长逐渐升至设定的QPS阈值。
com.alibaba.csp.sentinel.slots.block.flow.controller.WarmUpController
在这里插入图片描述应用场景:
在这里插入图片描述3)排队等待
19.Sentinel限流熔断_第7张图片匀速排队,阈值必须设置为QPS

19.Sentinel限流熔断_第8张图片在这里插入图片描述

3.降级规则

在这里插入图片描述Sentinel的断路器是没有半开状态的

半开的状态系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,有则继续打开断路器不可用。

19.Sentinel限流熔断_第9张图片1)RT
19.Sentinel限流熔断_第10张图片2)异常比例
19.Sentinel限流熔断_第11张图片3)异常数 异常数是按照分钟统计的
19.Sentinel限流熔断_第12张图片

4.热点key限流和系统规则

4.1 热点key限流

代码:

@GetMapping("/testHotKey")
@SentinelResource(value = "testHotKey",blockHandler = "deal_testHotKey")
public String testHotKey(@RequestParam(value = "p1",required = false) String p1,
                         @RequestParam(value = "p2",required = false) String p2) {
    //int age = 10/0;
    return "------testHotKey";
}
 
//兜底方法
public String deal_testHotKey (String p1, String p2, BlockException exception){
    return "------deal_testHotKey,o(╥﹏╥)o";  
}

配置参数例外项
19.Sentinel限流熔断_第13张图片热点参数的注意点,参数必须是基本类型或者String
19.Sentinel限流熔断_第14张图片

4.2 系统规则

19.Sentinel限流熔断_第15张图片

5. @SentinelResource注解

官方文档:https://sentinelguard.io/zh-cn/docs/annotation-support.html

注意:注解方式埋点不支持 private 方法。

@SentinelResource 用于定义资源,并提供可选的异常处理和 fallback 配置项。 @SentinelResource 注解包含以下属性:
value:资源名称,必需项(不能为空)

entryType:entry 类型,可选项(默认为 EntryType.OUT)

blockHandler / blockHandlerClass: blockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

fallback:fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。fallback 函数签名和位置要求:
返回值类型必须与原函数返回值类型一致;
方法参数列表需要和原函数一致,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
fallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所以类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。defaultFallback 函数签名要求:
返回值类型必须与原函数返回值类型一致;
方法参数列表需要为空,或者可以额外多一个 Throwable 类型的参数用于接收对应的异常。
defaultFallback 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 fallbackClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。

exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

注:1.6.0 之前的版本 fallback 函数只针对降级异常(DegradeException)进行处理,不能针对业务异常进行处理。

特别地,若 blockHandler 和 fallback 都进行了配置,则被限流降级而抛出 BlockException 时只会进入 blockHandler 处理逻辑。若未配置 blockHandler、fallback 和 defaultFallback,则被限流降级时会将 BlockException 直接抛出。

19.Sentinel限流熔断_第16张图片Feign与Sentinel:
测试84通过Feign调用9003,此时故意关闭9003微服务提供者,看84消费侧自动降级,不会被耗死

19.Sentinel限流熔断_第17张图片

6.规则持久化

6.1 与nacos配合持久化

一旦我们重启应用,Sentinel规则将消失,生产环境需要将配置规则进行持久化

将限流配置规则持久化进Nacos保存,只要刷新8401某个rest地址,sentinel控制台的流控规则就能看到,只要Nacos里面的配置不删除,针对8401上Sentinel上的流控规则持续有效

引入依赖

<dependency>
    <groupId>com.alibaba.cspgroupId>
    <artifactId>sentinel-datasource-nacosartifactId>
dependency>

yml配置:添加Nacos数据源配置

server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
    sentinel:
      transport:
        dashboard: localhost:8080 #配置Sentinel dashboard地址
        port: 8719
      datasource:
        ds1:
          nacos:
            server-addr: localhost:8848
            dataId: cloudalibaba-sentinel-service
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow

management:
  endpoints:
    web:
      exposure:
        include: '*'

添加Nacos业务规则配置
19.Sentinel限流熔断_第18张图片1)限流说明
19.Sentinel限流熔断_第19张图片limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
controlBehavior: 流量控制效果(0 直接拒绝 默认、1 Warm Up、2 匀速排队)

[
    {
         "resource": "/retaLimit/byUrl",
         "limitApp": "default",
         "grade":   1,
         "count":   1,
         "strategy": 0,
         "controlBehavior": 0,
         "clusterMode": false    
    }
]

2)熔断说明

resource:资源名,即限流规则的作用对象

grade: 熔断类型 0 慢查询比列,1 异常比例,2异常数

count: 熔断阈值 (grade =0时,表示慢查询设置时间 单位ms,大于此值为慢查询,grade =1时 表示异常比例的阈值 :范围 [0.0-1.0],grade =2时 表示异常数阈值)

timeWindow:时间窗口 单位 s,在此时间段内都会熔断

slowRatioThreshold:慢查询比例阈值 范围 [0.0-1.0]

minRequestAmount:最少通过数量,无论是否触发熔断,至少通过请求数量。

statIntervalMs:统计窗口时长 单位ms

注意:目前选用grade=2 异常数熔断,当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

[
    {
        "resource": "testA",
        "minRequestAmount": "2",
        "grade": 2,
        "count": 3,
        "timeWindow": 5000,
        "StatIntervalMs": 5000
    }
]

你可能感兴趣的:(#,SpringCloud,spring,cloud,sentinel,限流,降级,熔断)