springcloud入门篇——sentinel

该文主要参考https://blog.csdn.net/lzb348110175/article/details/107532937

对sentinel进行下载安装、项目配置、控制台配置、自定义兜底方法、sentinel持久化进行简要说明

阿里用sentinel代替hystrix

Sentinel分为两个部分:

  • 核心库(Java客户端)不依赖任何框架/库,能够运行于所有Java运行时环境,同时对Dubbo/Spring Cloud等框架也有较好的支持。
  • 控制台(Dashboard)基于SpringBoot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。

一、下载安装

官网:https://github.com/alibaba/Sentinel

下载地址:https://github.com/alibaba/Sentinel/releases

安装步骤:

下载到本地sentinel-dashboard-1.7.0.jar

运行命令:java -jar sentinel-dashboard-1.7.0.jar

访问localhost:8080

登录名密码都为 sentinel

此时我们要去项目设置就能看到相应的监控了

二、项目配置sentinel

1.启动服务注册中心 Nacos8848

2、新建cloudalibaba-sentinel-service8401模块

pom:

<!--pom.xml依赖-->
    <dependencies>
        <!--springcloud alibaba nacos-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--springcloud alibaba sentinel-datasource-nacos 后续做持久化用到-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
        <!--springcloud alibaba sentinel-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <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>
        <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>
        <dependency>
            <groupId>com.cloud</groupId>
            <artifactId>cloud-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

yml:

#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: '*'

启动类:

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

controller

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

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

此时要sentinel控制台有信息,要先调用一下接口

再去查看sentinel控制台:

三、sentinel控制台的配置

1、实时监控:对于某服务的接口调用QPS(每秒钟的请求数量)、响应时间等的图表信息

2、簇点链路:对于服务链路的信息记录、还可以对该链路进行操作

3、对某接口的流控操作

点击流控操作,出现下面窗口:

这里对这些窗口进行说明:
1、资源名:即接口/链路,唯一名称,默认请求路径

2、针对来源:Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)

3、阈值类型/单机阈值:

  1. QPS(每秒钟的请求数量):当调用该api的QPS达到阈值的时候,进行限流
  2. 线程数:当调用该api的线程数达到阈值的时候,进行限流
  3. 单机阈值,当阈值类型为qps时,则表示当单机的qps达到阈值时进行限流;当为线程数类型时表示单机的线程数达到阈值时限流

例如类型为QPS,单机阈值为100——代表QPS达到100时,对/testB进行限流操作。

类型为线程数时,单机阈值为20——代表当线程数达到20时,对/testB进行限流操作

那么进行什么限流操作?就是下面的配置了

4、流控模式:即进行限流的模式

      4.1:直接失败:如果达到阈值,则直接返回sentinel自带的限流信息

4.2:关联

 

当关联的资源达到阈值时,就限流自己。当与 A 资源关联的 B 资源达到阈值时,就限流自己(A),即:B惹事,A挂了

应用场景:双十一,支付接口下单接口关联。当支付接口达到阈值,就限流下单接口(就是前面不要再接单了)

举例说明:

现在对于/testA配置了关联模式,即/testA 服务关联/testB 服务,1s 调用 1次,服务正常。当狂点刷新调用 /testB 服务,超出阈值 QPS = 1 后,此时 /testA 被限流了,这就是 B惹事,A挂了

4.3:链路

链路:当链路中的资源达到阈值时,就会对使用到该资源的链路进行流控。当 A01 资源达到设定阈值时,所有调用该服务的链路,都会被限流,即:A01 挂了,用到我的链路都得挂

  此处会用到 @SentinelResource 注解 value 属性值 作为资源名。此处只是使用一下。该注解的详细使用,请跳转链接:@SentinelResource 介绍

模拟两条请求链路:

  1. A链路: A → A01 → A04 → A05
  2. B链路: B → A01 → A02 → A03
    在这里插入图片描述

配置:
在这里插入图片描述

配置说明:

  对 testA01 服务进行 链路 流控,该服务关联有 A 和 B 两条链路。当 A 链路1s 调用 1次,服务正常。当该链路调用 超出阈值 QPS = 1 后,此时A链路都会被限流,同时因为B链路也调用 testA01,所以B链路也会同时被限流调用

资源名称针对来源阈值类型单机阈值流控模式入口资源流控效果
testAdefaultQPS1链路sentinel_web_servlet_context快速失败

5、流控效果:即限流的处理效果

5.1:快速失败

5.2:Warm Up

Warm Up:某个服务,日常访问量很少,基本为 0,突然1s访问量 10w,这种极端情况,会直接将服务击垮。所以通过配置 流控效果:Warm Up允许系统慢慢呼呼的进行预热,经预热时长逐渐升至设定的QPS阈值。

公式计算:

公式:阈值/coldFactor(默认值为3)

应用场景:

  秒杀系统。秒杀系统在开启的瞬间,会有很多的流量上来,很有可能将系统打死。预热方式就是为了保护系统,可以慢慢的将流量放进来,最终将阈值增长到指定的数值

配置:
在这里插入图片描述
配置说明:

  /testA 服务,设置 QPS 单机阈值为 10,采用 Warm Up 预热的方式,预热时长为 5s。根据计算公式 10 / 3 = 3,前 5s 的阈值为 3,预热 5s 后阈值增长到 10。

简单点讲:一开始给你10/3=3QPS,然后会在5s内升到10QPS

资源名称阈值类型单机阈值流控模式流控效果预热时长
/testAQPS10直接Warm Up5s

5.3、排队等待

排队等待:让请求以均匀的速度通过,对应的是漏桶算法。这种方式主要用于处理间隔性突发的流量,例如消息队列。

应用场景:

  在某一秒有大亮的请求到来,而接下来的几秒则处于空闲状态。我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。

配置:
在这里插入图片描述
配置说明:

  /testA 服务,设置 QPS 单机阈值为 2,每秒只接收 2 个请求。设置超时时间 5s。采用漏斗算法,让后台匀速的处理请求,而不是直接拒绝更多的请求。超时的请求则被抛弃,返回错误信息。

简单点讲:每秒只处理2个请求(你不要理我闲不闲),其他的慢慢排队

资源名称阈值类型单机阈值流控模式流控效果预热时长
/testAQPS2直接排队等待5000ms

 

6、降级规则

降级规则。可自行参考官网介绍:GitHub 熔断降级。降级策略有 RT异常比例异常数 三种,每一项具体代表的什么含义,继续听我娓娓道来。

在这里插入图片描述

资源名:唯一路径,默认为请求路径(也可以是后续介绍的 @SentinelResource 注解的 value 属性值)

2.1 RT

RT:即 平均响应时间(DEGRADE_GRADE_RT) 。官网介绍太笼统,此处不Copy 了,要看官网介绍来这里:RT 平均响应时间介绍

注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。

图示:
在这里插入图片描述
配置:
在这里插入图片描述
配置说明:

  /testA 服务,设置 降级策略为 RT,RT(平均响应时间)为 200ms,时间窗口为 5s。发送请求平均响应时间在 200ms 内,正常访问不会被熔断降级。当平均响应时间 > 200ms,便会被熔断降级。时间窗口5s内断路器处于打开状态,无法提供服务,时间窗口结束,服务恢复正常访问。就是服务会被熔断5s的意思切记是平均响应时间

资源名称降级策略RT(平均响应时间)时间窗口
/testART200ms5s

业务代码:

/**
 * 使/testA休眠300ms
 */
@RestController
public class FlowLimitController {

    @GetMapping("/testA")
    public String testA() throws InterruptedException {
        TimeUnit.MILLISECONDS.sleep(300);
        return "-----testA";
    }
}

测试:

  RT降级规则,需要同时满足:1.QPS>=5 && 2.平均响应时长> 200 两个条件。手动发送请求操作看的明显,此时 1秒钟发送 >5 个请求,由于每个请求都 sleep 300ms,请求最终平均响应时间为 300+ ms,肯定 > 200ms。满足上述两个条件,执行 RT 降级规则,开始熔断后,时间窗口期5s内,断路器处于打开状态,此时为熔断阶段,时间窗口结束,断路器关闭,关闭服务熔断,服务可以正常访问。 如图所示:
在这里插入图片描述

2.2 异常比例

异常比例QPS >= 5 && 异常比例超过设定的阈值,便会发生服务降级 。

异常比例为 0.0~1.0 范围内值。时间窗口就是断路器开启时间长短(降级时间) 。要看官网介绍来这里:异常比例介绍

图示:
在这里插入图片描述
配置:
在这里插入图片描述
配置说明:

  /testA 服务,设置 降级策略为 异常比例,异常比例设为 0.5,时间窗口为 5s。即:1s 发送6个请求,异常比例超过 50%,就会被熔断,断路器打开5s,5s后自动关闭,继续提供服务。

资源名称降级策略异常比例(0.0-1.0)时间窗口
/testA异常比例0.55s

业务代码:

/**
 * 自己造一个 by zero 异常
 */
@RestController
public class FlowLimitController {

    @GetMapping("/testA")
    public String testA(){
        int i = 10/0;
        return "-----testA";
    }
}

测试:

  我们配置的异常比例降级规则,需要同时满足:1.QPS>=5 && 2.异常比例> 50% 两个条件。手动发送请求操作看的明显,此时 1秒钟发送 >5 个请求,因为每个请求都是异常,异常比例 100%。

  如果1s发送6次请求,前3次报错,因为第4次访问后,异常比例 > 50%,第4次便会被熔断,报 Blocked by Sentinel(flow limiting)。5s后继续提供服务哦。测试结果如图所示:
在这里插入图片描述

2.3 异常数

异常数:指的是资源 近1分钟 的异常数目,超过阈值之后会进行熔断。

重点注意:异常数,统计时间窗口是分钟级别,若 timeWindow 小于 60s,则结束熔断状态后仍可能再次进入熔断状态。推荐 时间窗口一定要>=60s

官网介绍来这里看:异常数介绍

图示:
在这里插入图片描述
配置:
在这里插入图片描述
配置说明:

  /testA 服务,设置 降级策略为 异常数,异常数设为 5,时间窗口为 60s。即:调用服务,当异常数超过5个时,开启断路器,执行熔断操作。60s 后,断路器关闭,服务恢复正常,如下图:

资源名称降级策略异常数时间窗口
/testA异常数560s

业务代码:

/**
 * 自己造一个 by zero 异常
 */
@RestController
public class FlowLimitController {

    @GetMapping("/testA")
    public String testA(){
        int i = 10/0;
        return "-----testA";
    }
}

测试:

  执行 /testA 服务请求,因为每个请求都是异常,前5次调用正常返回,只是报异常到前台;第6次服务调用时,便会被降级熔断。报 Blocked by Sentinel(flow limiting)。60s后继续提供服务哦。测试结果如图所示:
在这里插入图片描述

7、热点规则

3.1 何为热点

  (本段内容摘自:Github 热点规则官方介绍)

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

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

  热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。 热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
在这里插入图片描述
  Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式。(详细介绍,参考:Github 热点规则官方介绍)

3.2 何为热点限流

  一句话解释:根据 url 传递进来的参数进行限流。带这个参数就限流,不带就不限流。

3.3 热点规则

  热点规则。可自行参考官网介绍:GitHub 热点参数限流,共有 资源名限流模式(只支持QPS模式)参数索引单机阈值统计窗口时长是否集群 六种参数;高级选项还有额外一些参数,在用到时介绍。每一项具体代表的什么含义,来继续听我絮絮叨叨吧。

  此处会用到 @SentinelResource 注解 value 属性值 作为资源名。此处只是使用一下。该注解的详细使用,请跳转链接:@SentinelResource 介绍
在这里插入图片描述

资源名:唯一路径,默认为请求路径。此处必须是 @SentinelResource 注解的 value 属性值,配置@GetMapping 的请求路径无效)
参数索引:参数索引(从0开始,0表示第一个参数、1表示第二个参数)

Ⅰ.基本配置

1.@SentinelResource 注解说明

  @SentinelResource 注解,与 @HystrixCommand 类似,也是用来定义服务降级 兜底方法 的注解。该注解有很多属性可以配置。在下一篇会系统介绍:@SentinelResource 介绍

2.业务代码:

@RestController
public class FlowLimitController {

    @GetMapping("/testC")
    @SentinelResource(value = "testC") //此处value值,一般为@GetMapping属性值去掉斜杠
    public String testC(@RequestParam(value = "id",required = false) Integer id,
                        @RequestParam(value = "name",required = false) String name){
        return "-----testC";
    }
}

3.配置:
在这里插入图片描述
4.配置说明:

  对 /testC 服务,配置热点key限流。当 1.参数 name 存在   2.一秒内调用 /testC 服务 > 5次,满足限流规则。服务将被熔断。断路器打开,5s 后服务恢复正常

资源名称参数索引单机阈值统计窗口时长
testC(不能是请求路径,否则无效)155s

5.测试:

  调用 URL:http://localhost:8401/testC?id=1&name=James1.参数 name 存在   2.一秒内调用 /testC 服务 > 5次,满足限流规则。服务将被熔断。断路器打开,5s 后服务恢复正常。如下图:
在这里插入图片描述
6.友好处理

  被限流后,直接报错 java.lang.refletc.UndeclaredThrowableException。异常显示到前台用户界面,显然不是不友好。

  此处也是需要用到 @SentinelResource 的 blockHandler 属性,它是 Sentinel控制台违规的兜底方法配置(还会j介绍一个 fallback属性,它是@GetMapping请求Java 方法执行出现异常的兜底方法配置,要分清楚)

  兜底方法配置,在下一篇介绍:@SentinelResource 介绍

Ⅱ.参数例外项配置

1.需求:

  当 name 参数值为 Wade 时,限流阈值变更为 100。此时就需要对 参数例外项 进行配置了。

  参数类型 支持:intdoubleStringlongfloatcharbyte 7种类型,参数值 指 name 参数的值,限流阈值 指该参数值允许的阈值。

2.配置:
在这里插入图片描述

3.测试:

  调用 URL:http://localhost:8401/testC?id=1&name=Wade,虽然 name 参数存在,但是配置了 Wade 限流阈值为 100。我手速没那么快,哈哈,所以不会进入熔断。如下图所示:在这里插入图片描述

8、系统规则

系统保护规则是从应用级别的入口流量进行控制,从单台机器的 load、CPU 使用率、平均 RT、入口 QPS 和并发线程数等几个维度监控应用指标,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

  系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入应用的流量(EntryType.IN),比如 Web 服务或 Dubbo 服务端接收的请求,都属于入口流量。

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

1.系统规则支持以下模式

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

  此处内容,CPU 使用率总平均 RT并发线程数 等也不好演示,理解意思知道有这块用于全局应用入口流量控制就可以了,详细介绍还是参考官网来吧:热点参数限流

2. 入口QPS配置

  入口QPS,实用性还是比较危险的。 如果 sentinel 密码被修改,将你的整个系统 入口QPS 配置很小,那么整个系统就瘫痪了。

  但是 入口QPS 有总控的功能。最终选择是否使用,还是视情况而定吧

配置:
在这里插入图片描述
配置说明:

   整个系统,每个请求 QPS = 1 正常访问,当该请求 QPS >1 就会被限流。

测试:
在这里插入图片描述

该篇文章主要看https://blog.csdn.net/lzb348110175/article/details/107532937(写的很详细,就不浪费时间)

 

四、自定义兜底方法

下面则对于sentinel自定义降级兜底方法的实现(上面sentinel控制台的降级规则是使用sentinel自带的兜底方法,而下面我们利用@SentinelResource来自定义兜底方法)

接上面文章:Spring Cloud Alibaba Sentinel 流控、降级、热点、系统规则详解。了解完 Sentinel 流控、降级、热点、系统规则后,本文 来聊聊 @SentinelResource 注解的使用

  @SentinelResource 可以说是 Sentinel 学习的突破口,搞懂了这个注解的应用,基本上就搞清楚了 Sentinel 的大部分应用场景。Sentinel 提供了 @SentinelResource 注解用于定义资源,并提供了AspectJ的扩展用于自动定义资源、处理BlockException等。

1.@SentinelResource 属性介绍

其中blockHandler是处理sentinel控制台出错时的兜底方法,而fallback是处理不违反控制台出错规则但系统程序出错的兜底方法(例如控制台规定QPS不超过10,如果此时超过10则调用blockHandler的兜底方法,如果此时QPS不超过10但程序中有10/0这种错误,就会走fallback的兜底方法)

(红色标注属性为常用属性)

属性名是否必填说明
value资源名称 。(必填项,需要通过 value 值找到对应的规则进行配置)
entryTypeentry类型,标记流量的方向,取值IN/OUT,默认是OUT
blockHandler处理BlockException的函数名称(可以理解为对Sentinel的配置进行方法兜底)。函数要求:
1.必须是 public 修饰
2.返回类型与原方法一致
3. 参数类型需要和原方法相匹配,并在最后加 BlockException 类型的参数。
4. 默认需和原方法在同一个类中。若希望使用其他类的函数,可配置 blockHandlerClass ,并指定blockHandlerClass里面的方法。
blockHandlerClass存放blockHandler的类
对应的处理函数必须 public static 修饰,否则无法解析,其他要求:同blockHandler。
fallback用于在抛出异常的时候提供fallback处理逻辑(可以理解为对Java异常情况方法兜底)
fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。函数要求:
1.返回类型与原方法一致
2.参数类型需要和原方法相匹配,Sentinel 1.6开始,也可在方法最后加 Throwable 类型的参数。
3.默认需和原方法在同一个类中。若希望使用其他类的函数,可配置 fallbackClass ,并指定fallbackClass里面的方法。
fallbackClass存放fallback的类
对应的处理函数必须static修饰,否则无法解析,其他要求:同fallback。
defaultFallback用于通用的 fallback 逻辑
默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,以fallback为准。函数要求:
1.返回类型与原方法一致
2.方法参数列表为空,或者有一个 Throwable 类型的参数。
3.默认需要和原方法在同一个类中。若希望使用其他类的函数,可配置 fallbackClass ,并指定 fallbackClass 里面的方法。
exceptionsToIgnore指定排除掉哪些异常。
排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出。
exceptionsToTrace需要trace的异常

2. fallback 指定Java异常兜底方法

  fallback只用来处理与Java逻辑异常相关的兜底。比如:NullPointerException、ArrayIndexOutOfBoundsException 等Java代码中的异常,fallback 指定的兜底方法便会生效。

2.1 兜底方法与业务方法耦合

@GetMapping("/testA")
@SentinelResource(value = "testA", fallback = "fallbackMethod")
public String testA() {
    int i = 10 / 0;
    return "-----testA";
}

public String fallbackMethod(Throwable e) {
    return "限流请求连接(Java类异常)的兜底方法:" + e.getMessage();
}

2.2 使用 fallbackClass 将兜底方法与业务解耦合

/**
 * 业务逻辑
 */
@GetMapping("/testA")
@SentinelResource(value = "testA", fallback = "fallbackMethod", fallbackClass = CustomerFallback.class)
public String testA() {
    int i = 10 / 0;
    return "-----testA";
}

/**
 * 单独一个类,存放兜底方法
 */
public class CustomerFallback {

    public static String fallbackMethod(Throwable e) {
        return "限流请求连接(Java类异常)的兜底方法:" + e.getMessage();
    }
}
  • 在这里插入图片描述

2.3 兜底结果返回:
在这里插入图片描述

3. blockHandler 指定 Sentinel 配置兜底方法

  blockHandler 只用来处理 与 Sentinel 配置有关的兜底。比如:配置某资源 QPS =1,当 QPS >1 时,blockHandler 指定的兜底方法便会生效。

3.1 兜底方法与业务方法耦合.

/**
 * 业务逻辑
 */
@GetMapping("/testB")
@SentinelResource(value = "testB",blockHandler = "exceptionMethod")
public String testB() {
    return "-----testB";
}

public String exceptionMethod(BlockException exception) {
    return "限流@SentinelResource value 属性的兜底方法:" + exception;
}

3.2 使用 fallbackClass 将兜底方法与业务解耦合

@GetMapping("/testB")
@SentinelResource(value = "testB",blockHandler = "exceptionMethod",blockHandlerClass = CustomerBlockHandler.class)
public String testB() {
    return "-----testB";
}

/**
 * 单独一个类,存放兜底方法
 */
public class CustomerBlockHandler {

    public static String exceptionMethod(BlockException exception) {
        return "处理与 Sentinel 配置相关的兜底方法:" + exception;
    }
}

在这里插入图片描述
3.3 兜底结果返回
在这里插入图片描述

4. exceptionsToIgnore 用于指定异常不走兜底方法

  使用 exceptionsTolgnore 属性,来 指定某些异常不执行兜底方法,直接显示错误信息。配置 ArithmeticException 异常不走兜底方法。java.lang.ArithmeticException: / by zero ,便不会再执行兜底方法,直接显示错误信息给前台页面。

@GetMapping("/testA")
@SentinelResource(value = "testA", 
					fallback = "fallbackMethod",
					fallbackClass = CustomerFallback.class, 
					exceptionsToIgnore = ArithmeticException.class)
public String testA() {
    int i = 10 / 0;
    return "-----testA";
}

不走兜底方法,直接返回异常到页面:
在这里插入图片描述

5.defaultFallback 用于指定通用的 fallback 兜底方法

使用 defaultFallback 来指定通用的 fallback 兜底方法。

  1. 如果当前业务配置有 defaultFallback 和 fallback 两个属性,则优先执行 fallback 指定的方法。
  2. 如果 fallback 指定的方法不存在,还会执行 defaultFallback 指定的方法。
/**
 * 业务逻辑
 */
@GetMapping("/testA")
@SentinelResource(value = "testA",
        fallback = "fallbackMethod",
        fallbackClass = CustomerFallback.class,
        defaultFallback = "defaultFallbackMethod" //直接指定即可,使用比较简单
)
public String testA() {
    int i = 10 / 0;
    return "-----testA";
}

/**
 * 单独一个类,存放兜底方法
 */
public class CustomerFallback {

    public static String defaultFallbackMethod(Throwable e) {
        return "通用的fallback兜底方法";
    }

    public static String fallbackMethod(Throwable e) {
        return "限流请求连接(Java类异常)的兜底方法:" + e.getMessage();
    }
}

aa

五、持久化sentinel(一般是配置到注册中心apollo/nacos/zookeeper等)

Sentinel 控制台规则持久化问题

  在 Sentinel 中,我们会为多个服务进行 流控、限流、热点 等规则 的配置,但是当服务重启后再进入 Sentinel 后,发现之前配置过的规则都不在了,这样子的体验显然不友好,此时就需要我们对 Sentinel 中配置的规则规则进行持久化操作。

  目前控制台的规则推送也是通过 规则查询更改 HTTP API 来更改规则。这也意味着这些规则 仅在内存态生效,应用重启之后,该规则会丢失。

  以上是原始模式。当了解了原始模式之后,我们非常鼓励您通过 动态规则 并结合各种外部存储来定制自己的规则源。我们推荐通过动态配置源的控制台来进行规则写入和推送,而不是通过 Sentinel 客户端直接写入到动态配置源中。在生产环境中,我们推荐 push 模式,

规则管理及推送

可以参考:https://github.com/alibaba/Sentinel/wiki/%E5%9C%A8%E7%94%9F%E4%BA%A7%E7%8E%AF%E5%A2%83%E4%B8%AD%E4%BD%BF%E7%94%A8-Sentinel

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值