持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第22天,点击查看活动详情
1 热点规则概念
啥是热点数据嘞,热点数据就是经常被访问的数据。
当我们想对访问量较高的热点数据进行访问限制的时候,可以使用Sentinel 热点规则。比如:
- 以商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
- 以用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制
热点参数限流会根据传入参数中的热点参数和配置的限流阈值与模式,对包含热点参数的资源调用进行限流。
热点参数限流可以看做是一种特殊的流量控制,但是仅对包含热点参数的资源调用生效
2 热点规则详细配置
2.1 对应方法加注解@SentinelResource
必须要配合对应的SentinelResource注解
@GetMapping("/testHotKey")
@SentinelResource(value = "testHotKey",blockHandler = "handler_HotKey")
public String testHotKey(@RequestParam(value = "hot1",required = false) String hot1,
@RequestParam(value = "hot2",required = false)String hot2,
@RequestParam(value = "hot13",required = false) String hot3){
return "----testHotKey";
}
Sentinel 提供了 @SentinelResource 注解用于定义资源,它有很多的参数,我们这里主要关注两个参数:
value代表资源名称,一般与方法名相同,必填项。blockHandler当访问配置的热点数据被限流之后访问的方法。- 可选项,可以传入也可以不传入
- 修饰符必须是public
- 该方法的参数类型和参数数量需要和原方法一致,并且在最后增加参数
BlockException
//处理异常方法,方法签名要和对应的接口方法保持一致
public String handler_HotKey(String hot1, String hot2,String hot3,BlockException exception){
return "系统繁忙稍后重试。。";
}
2.2 配置方法
可进行如下配置:
这里表示对资源testHoliday的第一个参数hot1添加热点规则。
传入了这个参数并且f访问频率超过阈值一秒一次。则进行限流,被限流的请求会进入handler_HotKey方法。
3 热点规则参数例外项
可以通过参数例外项设置hot1具体等于特殊的某个值的时候,触发不同的限流效果。
这里的参数类型只能为以下7种类型的值:
我们可以做以下配置:
这里表示当第一个参数hot1的值为10086的时候,限流阈值变为5.
4 Sentinel 系统规则
系统保护规则是从应用级别的入口流量进行控制,从单台机器的 load、CPU 使用率、平均 RT、入口 QPS 和并发线程数等几个维度监控应用指标,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。
系统保护规则作用于应用整体维度,仅对入口流量生效。
系统规则支持以下的模式:
Load 自适应
以系统的一分钟平均负载作为指标,进行自我保护。
当这个负载超过设定的阈值的,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护。
系统容量由系统的
maxQps(秒级统计的最大QPS) * minRt(秒级统计的最小响应时间)估算得出。设定参考值一般是CPU cores * 2.5。
CPU usage
CPU的使用率作为参考指标,当使用率超过设定值,则触发系统保护。
平均 RT
当一台机器的所有入口的平均RT超过设定的阈值的时候,触发系统保护。
并发线程数
当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
入口 QPS
当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。