一. 流控
-
流控规则
- 资源名: 唯一名称,默认请求路径
- 针对来源: Sentinel可以针对调用者进行限流,填写微服务名称,默认default(不区分来源)
- 阈值类型/单机阈值:
- QPS(每秒请求数量) : 当调用该api的QPS到达阈值的时候,进行限流
- 线程数: 当调用该api的线程数达到阈值时,进行限流
- 是否集群: 不需要集群
- 流控模式:
- 直接: api达到限流条件时,直接限流
- 关联: 当关联的资源达到阈值时,就限流自己
- 链路: 只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流),api级别的针对来源
- 流控效果:
- 快速失败: 直接失败,抛异常
- Warm Up: 根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值
- 冷加载因子: 系统初始化时的阈值为 设置的阈值/冷加载因子(3) 然后过了设定的预热时长后,阈值才慢慢恢复到设定的值
- 排队等待,超过阈值部分进行排队等待,底层使用漏桶算法,适用于流量时多时少的情况
二. 熔断降级
- RT: 平均响应时间.当1s内持续进入N(大于5)个请求,对应时刻的平均响应时间均超过阈值,那么在接下来的时间窗口内,对这个方法进行调用都会自动熔断,注意:RT的上限为4900ms,超出都会算作4900ms
- 异常比例: 当资源的每秒请求数量>=5,并且每秒异常总数占通过量的比值超过阈值之后,资源进入熔断状态,异常比率的阈值范围是[0.0,1.0] 代表0%到100%之间
- 异常数: 当资源近一分钟的异常次数超过阈值后,进行熔断,时间窗口是分钟级的,所以时间窗口不能小于60s,若小于60s,则熔断结束后任可能再次进入熔断状态
三. 热点限流
- 参数索引: 对第几个参数进行限流,如果访问网站不带这个参数,将不限流
- 例外参数值: 如图,当索引为0的参数值为s时,阈值将不再是1,而是10
四. 系统规则
- 全局的限流规则
- LOAD: 自适应,进队Linux/Unix-like机器有效
- CPU使用率: CUP占用率超过阈值,触发系统保护
五. 注解支持
@SentinelResource 注解
注意:注解方式埋点不支持 private 方法。
@SentinelResource
用于定义资源,并提供可选的异常处理和 fallback 配置项。 @SentinelResource
注解包含以下属性:
value
:资源名称,必需项(不能为空)entryType
:entry 类型,可选项(默认为EntryType.OUT
)blockHandler
/blockHandlerClass
:blockHandler
对应处理BlockException
的函数名称,可选项。blockHandler 函数访问范围需要是public
,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为BlockException
。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定blockHandlerClass
为对应的类的Class
对象,注意对应的函数必需为 static 函数,否则无法解析。fallback
/fallbackClass
: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
直接抛出(若方法本身未定义 throws BlockException 则会被 JVM 包装一层 UndeclaredThrowableException
)。
六. 规则持久化
-
在nacos中配置sentinel规则
-
[ { "resouce":"/testD", //资源名 "limitApp":"default", //来源应用 "grade":1, //阈值类型,0代表线程数,1代表QPS "count":1, //单机阈值 "strategy":0, //流控模式,0直接,1关联,2链路 "controlBehavior":0, //流控效果,0快速失效,1 Warm up,2排队等待 "clusterMode":false //是否集群 } ]
-
sentinel持久化还是得自己写配置文件,在sentinel控制台修改的规则不会影响到nacos的配置文件,当服务重启后,还是会使用nacos配置文件的配置规则