十九、SpringCloud Alibaba Sentinel实现熔断和限流 (二 流控+降级+热点key)
四、流控规则
1、介绍模式
在sentinel控制台哪儿配置?
2、流控模式
1)直接快速失败
①、配置及说明
/testA请求每秒请求数(QPS)超过单机域值1,直接快速失败然后响应给客户端
②、测试
缺点:直接返回报错信息,是否可以由自己编写限流处理方法
2)关联模式
①、关联模式是什么?
当关联的资源达到阈值时,就限流自己
可以理解为:当支付模块挂了时,需要对订单模块进行限流
②、配置
当 /testB QPS达到域值 ,testA请求就不能使用
③、测试
postman 20个线程每0.3秒访问一次testB,然后查看testA的请求结果
3、流控效果
1)直接 -> 快速失败 (默认的流控效果)
2)预热
①、说明
阈值除以coldFactor(默认值是3),经过多少预热时长后才会达到阈值
②、配置
③、应用场景
秒杀系统开开启的瞬间,会有很多流量上来,很有可能会将系统打死,预热的方式就是慢慢的将阈值
增长到设置的阈值
3)排队等待
①、排队等待是什么?
②、排队等待的设置
设置 testA每秒一次请求,超过的话就排队等待,等待的超时时间为20000毫秒
五、降级规则
1、官网
https://github.com/alibaba/Sentinel/wiki
2、基本介绍
Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或者异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其他的资源而导致级联错误
当资源被降级后,在接下来的降级时间窗口期之内,对该资源的调用都会自动熔断(默认行为是抛出 DegradeException)
【注意 2020年的cloud ,现在是由HALF OPEN状态的】Sentinel断路器是没有半开状态的
参考Hystrix
半开的状态系统自动去检测是否有请求异常
没有异常就关闭断路器恢复使用
3、降级策略实战
1)RT
①、是什么?
②、配置测试
2)异常比例 (暂时未写,以后补上)
3)异常数(暂时未写,以后补上)
六、热点key限流
1、是什么?
对热点参数进行限流(例如促销商品的主键)
2、官网
https://github.com/alibaba/Sentinel/wiki/%E7%83%AD%E7%82%B9%E5%8F%82%E6%95%B0%E9%99%90%E6%B5%81
3、@SentinelResource注解
为服务降级申明兜底方法
4、controller中声明兜底方法
@GetMapping("/testHotKey") @SentinelResource(value = "testHotKey",blockHandler = "del_testHotKey") public String testHotKey(@RequestParam(value = "p1",required = false) String p1, @RequestParam(value = "p2",required = false) String p2){ return "testHotKey"; } public String del_testHotKey(String p1, String p2, BlockedException exception){ return "========del_testHotKey,o(╥﹏╥)o"; }
5、在sentinel中添加热点限流配置
根据代码:
@SentinelResource(value = "testHotKey",blockHandler = "del_testHotKey")
在Sentinel控制台中添加配置
方法testHotKey里第一个参数,只要QPS超过每秒1次,马上进行降级处理
6、测试
7、参数例外项
普通的时候:超过1秒钟一个后,达到阈值后马上被限流
我们期待当p1参数是某个特殊值时,它的限流和平时不一样
配置如下
意思是:当p1的参数为1,每秒200次请求才会达到阈值
七、系统规则(总的配置 不常用)
配置全局QPS
原文地址:https://www.cnblogs.com/houchen/p/15182547.html
- 【译】《Understanding ECMAScript6》- 第三章-Object
- 【译】《Understanding ECMAScript6》- 第二章-函数
- 【译】《Understanding ECMAScript6》- 第一章-基础知识(二)
- 【译】《Understanding ECMAScript6》- 第一章-基础知识(一)
- 聊聊C10K问题及解决方案
- 【译】《Understanding ECMAScript6》- 简介
- 深入理解 Java 并发之 synchronized 实现原理
- 你真的很熟分布式和事务吗?
- 基于Nginx负载均衡方案
- Android 使用android-support-multidex解决Dex超出方法数的限制问题
- Netty 实现原理浅析
- 上海2017QCon个人分享总结
- 为最佳性能调优 Nginx
- 《微信小程序七日谈》- 第一天:人生若只如初见
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Istio的流量管理(实操三)
- istio的安全(概念)
- 面试题系列第5篇:JDK的运行时常量池、字符串常量池、静态常量池,还傻傻分不清?
- Go by Example 中文版: 互斥锁
- Idea初始化配置大全,以后重装再也不用各种百度了
- 使用这种技巧,可以大大地提高前端布局效率
- Element-UI表格组件实现行拖拽排序
- Vue自定义指令实现拖拽功能
- 小程序 Canvas 层级问题
- JDK 8 新特性之函数式编程 → Stream API
- golang 单元测试框架实践
- 想要成为前端Star 吗?一首歌时间将React/Vue 应用Docker 化
- 60亿次for循环,原来这么多东西
- 不要再问我 in,exists 走不走索引了...
- 知乎太可恶了,一言不合就封号?