目录

一、简介

二、热点参数规则

三、热点参数限流案例

四、热点限流-参数例外项

五、总结


一、简介

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制。比如:

  • 商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制
  • 用户 ID 为参数,针对一段时间内频繁访问的用户 ID 进行限制

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

Sentinel 利用 LRU 策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控。热点参数限流支持集群模式。

二、热点参数规则

热点参数规则(ParamFlowRule)类似于流量控制规则(FlowRule):

属性 说明 默认值
resource 资源名,必填  
count 限流阈值,必填  
grade 限流模式 QPS 模式
durationInSec 统计窗口时间长度(单位为秒),1.6.0 版本开始支持 1s
controlBehavior 流控效果(支持快速失败和匀速排队模式),1.6.0 版本开始支持 快速失败
maxQueueingTimeMs 最大排队等待时长(仅在匀速排队模式生效),1.6.0 版本开始支持 0ms
paramIdx 热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置  
paramFlowItemList 参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型  
clusterMode 是否是集群参数流控规则 false
clusterConfig 集群流控相关配置  

三、热点参数限流案例

前面我们已经了解了什么是热点参数限流,下面通过案例说明如何配置以及Sentinel是如何限流的。

【a】控制层添加如下方法

/*** @SentinelResource: 指定资源名称,作用与HystrixCommand大体一致* blockHandler: 指定降级处理方法,类似于Hystrix的fallbackMethod兜底方法*/@GetMapping("/testHotKeyRule")@SentinelResource(value = "testHotKeyRule", blockHandler = "testHotKeyRule_blockHandler")public String testHotKeyRule(@RequestParam(value = "username", required = false) String username,@RequestParam(value = "password", required = false) String password) {return "[热点限流规则]testHotKeyRule..";}public String testHotKeyRule_blockHandler(@RequestParam(value = "username", required = false) String username,@RequestParam(value = "password", required = false) String password,BlockException exception) {return "[热点限流规则-兜底方法]testHotKeyRule_blockHandler..";}

重启项目,浏览器访问: http://localhost:8401/testHotKeyRule,

说明我们接口是通的,下面我们看看如何配置。

【b】Sentinel热点限流配置,具体配置如下图

 上面的配置表示:当访问testHotKeyRule资源的时候,针对方法testHotKeyRule的第一个参数【这里对应我们controller中的username参数】的请求,如果一秒内的请求阈值QPS超过1次,那么将会触发兜底方法。

【c】测试

浏览器访问:http://localhost:8401/testHotKeyRule?username=wsh

注意,这时候我们是一秒内访问一次,可以看到,接口正常返回数据。

突然,我们增加请求接口的频率,手动触发一秒内请求次数大于1次:

可见,当违反上面的配置请求规则时,马上降级处理,成功执行我们指定的blockHandler兜底方法。

下面我们访问:http://localhost:8401/testHotKeyRule?password=123456,注意这个请求并没有包含我们Sentinel配置的参数索引为0的参数【username】,不管我们一秒一次请求还是一秒内疯狂请求资源:

可以看到,当请求接口未包含指定的限流Key时,是不会触发blockHandler兜底方法的。

四、热点限流-参数例外项

前面我们介绍了普通版的热点参数限流,当第一个参数访问次数超过一秒钟一次后,达到阈值1后马上被限流,但我们有时候期望我们的限流参数Key当它是某个特殊值时,它的限流值和平时不一样。所以Sentinel提供了参数例外项的配置以满足这种特殊需求。

例如:假如前面我们的第一个参数username=wsh的时候,它的阈值可以达到500。

【a】Sentinel参数例外项配置

【b】测试

浏览器疯狂访问:http://localhost:8401/testHotKeyRule?username=weishihuai

可以看到,当参数的值不满足例外项配置的值时,默认还是走普通的限流【一秒超过一次就直接降级】。

下面我们测试参数例外项: http://localhost:8401/testHotKeyRule?username=wsh

因为我们前面配置当参数的值等于"wsh"的时候,QPS阈值时500,所以当我们在浏览器一直刷新的时候,一秒钟内基本上不可能超过访问阈值500,所以也就不会触发降级方法。如下图所示:

下面我们说一个需要特别注意的地方,我们在业务方法里面模拟发生异常:

@GetMapping("/testHotKeyRule")@SentinelResource(value = "testHotKeyRule", blockHandler = "testHotKeyRule_blockHandler")public String testHotKeyRule(@RequestParam(value = "username", required = false) String username,@RequestParam(value = "password", required = false) String password) {int i = 10 / 0;return "[热点限流规则]testHotKeyRule..";}

重启项目,浏览器访问:http://localhost:8401/testHotKeyRule?username=weishihuai,

可以看到,直接将除数为0的报错展示出来了,并不会降级处理, 这里小伙伴们千万别搞错了, blockHandler兜底方法只针对你在Sentinel中配置的限流规则,当你违反了之后才会走兜底降级方法;如果是业务抛出的异常,Sentinel并不会降级处理。

小总结:

  • @SentinelResource:处理的是Sentinel控制台配置的违规情况,有blockHandler方法配置的兜底处理;
  • RuntimeException:java运行时抛出的运行时异常,@SentinelResource不管,@SentinelResource主管配置出错,运行该走异常还是走异常。

五、总结

热点参数限流规则主要是针对请求参数来统计,并实现限流的。首先热点参数是基于QPS统计,如果参数索引设置为0,则以第一个参数统计为准,阈值也是按照基本参数中的阈值来控制的,但是指定的是额外的参数列表的下标,则需要提供指定的热点参数的值,如果当前访问的参数与预设定的参数不一致,依旧与第一个参数的阈值为准。

以上相关项目的代码我已经放在Gitee上,有需要的小伙伴可以去拉取进行学习:https://gitee.com/weixiaohuai/springcloud_Hoxton,由于笔者水平有限,如有不对之处,还请小伙伴们指正,相互学习,一起进步。

下面是笔者总结的关于Spring Cloud Alibaba教程系列文章目录,有需要的小伙伴可以前往学习:

1. Spring Cloud Alibaba入门简介

2. Spring Cloud Alibaba Nacos之服务注册中心

3. Spring Cloud Alibaba Nacos之服务配置中心

4. Spring Cloud Alibaba Nacos集群和持久化配置

5. Spring Cloud Alibaba Sentinel之入门篇

6. Spring Cloud Alibaba Sentinel之流控规则篇

7. Spring Cloud Alibaba Sentinel之服务降级篇

8. Spring Cloud Alibaba Sentinel之热点参数限流篇

9. Spring Cloud Alibaba @SentinelResource配置详解

10. Spring Cloud Alibaba Sentinel之服务熔断篇

11. Spring Cloud Alibaba Sentinel之持久化篇

12. Spring Cloud Alibaba Seata处理分布式事务及案例实战

13. Spring Cloud Alibaba Seata工作原理

Spring Cloud Alibaba Sentinel之热点参数限流篇相关推荐

  1. 【Spring Cloud Alibaba Sentinel 实现熔断与限流】 —— 每天一点小知识

  2. 手把手带你领略双十一背后的核心技术Sentinel之热点参数限流

    文章目录 1.何为热点 2.基本使用1 3.基本使用2 1.何为热点 热点就是经常访问的数据,我们通常希望对某个访问次数最高的热点数据进行限制. 比如说商品中的某个访问量很高的商品.比如说商品中的某个 ...

  3. Spring Cloud Alibaba:Sentinel 热点参数限流

    文章目录 1. 前言 2. 热点规则配置 3. 参数例外项 1. 前言 Sentinel版本:1.8.0 何为热点?热点即经常访问的数据.很多时候我们希望统计某个热点数据中访问频次最高的 Top K ...

  4. Spring Cloud Alibaba - Sentinel入门案例(四)(热点规则 )

    Spring Cloud Alibaba - Sentinel入门案例(四)(热点规则 ) 回溯 什么是Sentinel? 正文 环境准备 简单使用 复杂使用 注意事项 回溯 什么是Sentinel? ...

  5. Spring Cloud Alibaba | Sentinel: 服务限流高级篇

    Spring Cloud Alibaba | Sentinel: 服务限流高级篇 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特殊说明 ...

  6. 【SpringCloud】Spring cloud Alibaba Sentinel 热点规则

    文章目录 1.概述 2.案例 2.1 参数限流 2.2 参数值限流 2.3 小结 1.概述 视频:https://www.bilibili.com/video/BV18E411x7eT?p=124&a ...

  7. Spring Cloud Alibaba —— Sentinel 详细使用

    导航 引言 一.Sentinel的两个基本概念 二.流控规则 2.1 基本选项 2.2 高级选项 三.熔断(降级)规则 四.热点规则 五.授权规则(了解) 六.系统规则(了解) 七.自定义异常返回 八 ...

  8. spring cloud alibaba sentinel 学习

    sentinel 学习 介绍(官方文档) 流量控制设计理念 熔断降级 Hystrix Sentinel 系统自适应保护 spring cloud alibaba sentinel sentinel.d ...

  9. 【java_wxid项目】【第十六章】【Spring Cloud Alibaba Sentinel集成】

    主项目链接:https://gitee.com/java_wxid/java_wxid 项目架构及博文总结: 点击:[使用Spring Boot快速构建应用] 点击:[使用Spring Cloud O ...

  10. Sentinel(九)之热点参数限流

    转载自  热点参数限流 Overview 何为热点?热点即经常访问的数据.很多时候我们希望统计某个热点数据中访问频次最高的 Top K 数据,并对其访问进行限制.比如: 商品 ID 为参数,统计一段时 ...

最新文章

  1. gbase 导出_GBase 8a导出本地文件时多了目录,gbase_export_directory参数用处
  2. 数量级提升!深度学习让机器人抓取更高效
  3. java流的写法_java IO-过滤流类的写法
  4. php——数据库操作之规范性
  5. js的concat方法的使用
  6. 私.Modbus测试_ZC01_TCP方式
  7. Downloader Middlewares
  8. django创建新的项目、App与基本配置
  9. linux创建了目录复制不存在,Linux:复制并创建目标目录,如果它不存在
  10. 官方晒中兴AXON 30 Pro真机亮屏谍照:第二代屏下摄像头技术提升明显
  11. Tess4J OCR简单使用教程
  12. SCT2650,4.5V-60V电压,芯洲降压DCDC转换器,参数
  13. 微信公众号留言功能开通流程
  14. Fast Non-Bayesian Poisson Factorization for Implicit-Feedback Recommendations
  15. pip‘s dependency resolver does not currently take into account 解决办法
  16. WKWebView - 1
  17. 在bandwagon上架设web服务器
  18. 利用sklearn库决策树模型对iris数据多分类并进行评估
  19. 现代社会科学的优选法:谈取向运作法
  20. (转)用AGG实现高质量图形输出(一)

热门文章

  1. mysql查询一周内的订单_MYSQL查询一周内的数据(最近7天的) 怎么写
  2. SwiftUI实战二:组合视图和地图视图
  3. 轻量级神经网络ShuffleNet
  4. c++关于函数的参数传递全部知识点详解
  5. 感悟:number 2
  6. 【生信进阶练习1000days】day13-GEOquery
  7. android studio for android learning (二十八) android基础知识
  8. 【Codeforces Round #546 (Div. 2) E】Nastya Hasn't Written a Legend【线段树】
  9. 跨页面调用方法_Excel多表汇总不用愁,五种多表合并方法,高效完成日常工作...
  10. linux下apache安装ssl,linux下apache安装ssl步骤