热点
- 热点就是经常访问的数据;
- 比如商品接口的 QPS 限定的是 100,有一天要秒杀,带着秒杀商品 id 的请求的 QPS 限制在 50,这样还能有 50 的 QPS 用来访问其他的商品;
- 这就提出了一个去求,要能根据请求的参数来做限流,比如请求带的参数是热点参数,就对这个请求应用特殊的限流规则;对携带非热点参数的请求,走另一个限流规则;
Sentinel 实现根据参数指定不同的限流规则(热点规则)
将商品查看接口看做成一个 @SentinelResource
@GetMapping("/{id}")
@SentinelResource(value = "getOrder")
public OrderInfo getInfo(@PathVariable Long id, @AuthenticationPrincipal String username) {
log.info("user name " + username);
log.info("orderId is " + id);
OrderInfo info = new OrderInfo();
info.setId(id);
info.setProductId(id * 5);
return info;
}
在 sentinel-dashboard 中添加热点规则
- 资源名(getOrder):
@SentinelResource(value = "getOrder")
中的value
值; - 参数索引(0):针对第 0 个参数;
- 参数类型(long):索引位置是 0 的参数的类型是 long;
- 参数值(1):如果其值是 1;
- 限流阈值(1):允许的 QPS 就是 1;
- 单机阈值(10):不是 1 的情况下,允许的 QPS 就是 10;
- 统计时间窗口(1):统计的时间单位,一般都是 1s;
配完了之后,对于被
@SentinelResource(value = "getOrder")
标注的接口,如果参数 id 带的值是 1,那么允许它的 QPS 就是 1;对于 id 值是其他的值的请求,允许其 QPS 就是 10;
系统规则
- 系统规则和热点规则不一样,热点规则是针对方法设定的,系统规则是针对一个应用设定的;
系统规则的 5 中预置类型
- LOAD:只有在 Linux 系统的机器上才会生效,可以根据当前操作系统的负载,来决定是否触发保护(把请求拒绝掉);
- RT:这个应用上,所有请求的平均响应时间,如果超过某个值,就停止新的请求;
- 线程数:这个应用上,所有的请求消耗的线程数加起来,如果超过某个值,就停止新的请求;
- 入口 QPS:这个应用上,所有接口的 QPS 加起来,如果超过某个值,就停止新的请求;
- CPU 使用率:CPU 的使用率,如果超过一个百分比,就停止新的请求;
发生系统规则中配置的情况的时候,会把整个应用都断掉,所有的接口对不能对外提供服务了,这个设计很少用,因为粒度太大了,用 Sentinel 一般都是做细粒度的维护,如果设置了系统规则,可能自己都不知道怎么回事,系统就用不了了;