是什么:当资源近 1 分钟的异常数目超过阈值之后会进行熔断降级。注意由于统计 时间窗口时分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。即 时间窗口一定要 >= 60 秒。
测试
代码:同异常比例
配置
jemter压测:直接 Blocked by Sentinel (flow limiting)
5.6 热点key限流官网说明
源码
com.alibaba.csp.sentinel.slots.block.BlockException
名词说明
何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如
商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会统计传入的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看作是一种特殊的流量控制,仅对包含热点参数的资源调用生效。
Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式。
回顾 - 兜底方法
兜底方法分为 系统默认 和 客户自定义 两种,之前限流出现问题后,都是用sentinel 系统默认的提示:Blocked by Sentinel (flow limiting)。
我们能不能自定义?类似hystrix,某个方法出问题了,就找对应的兜底降级方法!
⇒ 在sentinel中通过 @SentinelResource 注解能够实现 (类似于hystrix的HystrixCommand)。
/** * value: 唯一标识,对应热点规则资源名 * blockHandler:违背了热点规则后指向的兜底方法,如果不配置,异常就会直接打到前台去(不友好) */ @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){ return "==> testHotKey"; } public String deal_testHotKey(String p1, String p2, BlockException e) { return "==> deal_testHotKey"; }配置
方法testHotKey里面第一个参数只要QPS超过每秒1次,马上降级处理。且用了我们自定义的兜底方法。
测试
# QPS超过每秒1次会限流 :8401/testHotKey?p1=0 # QPS超过每秒1次会限流 :8401/testHotKey?p1=0&p2=1 # 无限制,不会限流 :8401/testHotKey?p2=1参数例外项
上述案例演示了第一个参数p1,当QPS超过每秒1次立刻就会被限流。
特殊情况:我们期望 p1 参数当它是某个特殊值时,它的限流和平时不一样,例如当 p1 的值等于 5 时,它的阈值可以达到 200。怎样实现呢?=> 配置参数例外项。
前提条件:热点参数必须是 基本类型 或者 String
其他注意点
@SentineResource 处理的是Sentinel控制台配置的违规情况,有blockHandler方法配置的兜底方法处理。假如程序代码出错如 int age = 10/0,这个是Java运行时爆出的运行时异常RunTimeException,@SentineResource 不管。
总结:@SentineResource 主管配置出错,运行出错该走异常还是会走异常!
5.7 系统规则官网说明
各项配置说明
系统保护规则是从应用级别的入口流量进行控制,从单台机器的 load,CPU使用率,平均RT,入口QPS 和并发线程数等几个维度监控应用指标,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
系统保护规则是 应用整体维度的,而不是资源维度的,并且 仅对入口流量生效。入口流量指的是进入应用的流量(EntryType.IN),比如 Web 服务器 或Dubbo 服务端接受的请求,都属于入口流量。
系统规则支持以下的模式:
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 达到阈值即触发系统保护。
配置全局QPS为例:
系统规则一般少用,使用危险,一竹竿打死一船人!
5.8 @SentinelResource按资源名称限流 + 后续处理
启动nacos,sentinel