该文主要参考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、阈值类型/单机阈值:
- QPS(每秒钟的请求数量):当调用该api的QPS达到阈值的时候,进行限流
- 线程数:当调用该api的线程数达到阈值的时候,进行限流
- 单机阈值,当阈值类型为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 介绍模拟两条请求链路:
- A链路:
A → A01 → A04 → A05
- B链路:
B → A01 → A02 → A03
配置:
配置说明:
对
testA01
服务进行链路
流控,该服务关联有 A 和 B 两条链路。当 A 链路1s 调用 1次,服务正常。当该链路调用超出阈值 QPS = 1 后,此时A链路都会被限流,同时因为B链路也调用 testA01,所以B链路也会同时被限流调用
。
资源名称 针对来源 阈值类型 单机阈值 流控模式 入口资源 流控效果 testA
default QPS
1
链路 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
资源名称 阈值类型 单机阈值 流控模式 流控效果 预热时长 /testA QPS
10
直接 Warm Up
5s
5.3、排队等待
排队等待:让请求以均匀的速度通过,对应的是漏桶算法。这种方式主要用于处理间隔性突发的流量,例如消息队列。
应用场景:
在某一秒有大亮的请求到来,而接下来的几秒则处于空闲状态。我们希望系统能够在接下来的空闲期间逐渐处理这些请求,而不是在第一秒直接拒绝多余的请求。
配置:
配置说明:
/testA
服务,设置 QPS 单机阈值为 2,每秒只接收 2 个请求。设置超时时间 5s。采用漏斗算法,让后台匀速的处理请求,而不是直接拒绝更多的请求。超时的请求则被抛弃,返回错误信息。简单点讲:每秒只处理2个请求(你不要理我闲不闲),其他的慢慢排队
资源名称 阈值类型 单机阈值 流控模式 流控效果 预热时长 /testA QPS
2
直接 排队等待
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(平均响应时间) 时间窗口 /testA RT
200ms
5s
业务代码:
/** * 使/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.5
5s
业务代码:
/** * 自己造一个 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 异常数
5
60s
业务代码:
/** * 自己造一个 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
(不能是请求路径,否则无效)1
5
5s
5.测试:
调用 URL:
http://localhost:8401/testC?id=1&name=James
,1.参数 name 存在 2.一秒内调用/testC
服务 > 5次,满足限流规则。服务将被熔断。断路器打开,5s 后服务恢复正常。如下图:
6.友好处理被限流后,直接报错
java.lang.refletc.UndeclaredThrowableException
。异常显示到前台用户界面,显然不是不友好。
此处也是需要用到 @SentinelResource 的 blockHandler 属性,它是 Sentinel控制台违规的兜底方法配置(还会j介绍一个 fallback属性,它是@GetMapping请求Java 方法执行出现异常的兜底方法配置,要分清楚)
兜底方法配置,在下一篇介绍:@SentinelResource 介绍
1.需求:
当 name 参数值为
Wade
时,限流阈值变更为 100。此时就需要对参数例外项
进行配置了。
参数类型
支持:int
、double
、String
、long
、float
、char
、byte
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
值找到对应的规则进行配置)entryType 否 entry类型,标记流量的方向,取值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 兜底方法。
- 如果当前业务配置有
defaultFallback
和fallback
两个属性,则优先执行fallback
指定的方法。- 如果
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 模式,
规则管理及推送