文章目录
-
- 1.熔断降级
-
-
- 1.基本介绍
- 2.熔断降级策略(以分钟为基本单位)
- 3.熔断降级实例---慢调用比例
-
- 1.需求分析
- [2.com/sun/springcloud/controller/MemberController.java 新增接口t3并休眠300ms](#2.com/sun/springcloud/controller/MemberController.java 新增接口t3并休眠300ms)
- 3.具体配置
- 4.测试
- 5.熔断降级实例---异常比例
-
- 1.需求分析
- [2.com/sun/springcloud/controller/MemberController.java 新增接口t4并出现异常返回error](#2.com/sun/springcloud/controller/MemberController.java 新增接口t4并出现异常返回error)
- 3.具体配置
- 4.测试
-
- [1.一秒超过五次请求 http://localhost:10004/t4,发生熔断降级](#1.一秒超过五次请求 http://localhost:10004/t4,发生熔断降级)
- 2.五秒之后再次发送请求,降级解除
- 6.熔断降级实例---异常数
-
- 1.需求分析
- 2.还是使用掐面的t4接口即可
- 3.具体配置
- 4.测试
-
- [1.一秒超过五次请求 http://localhost:10004/t4,由于每发生熔断降级](#1.一秒超过五次请求 http://localhost:10004/t4,由于每发生熔断降级)
- 2.五秒之后再次发送请求,降级解除
-
- 2.热点限流
-
-
- 1.基本介绍
- 2.需求分析
- 3.具体配置
- 4.测试
-
- [1.浏览器快速访问 http://localhost:10004/news?id=1\&type=动物 会出现热点限流](#1.浏览器快速访问 http://localhost:10004/news?id=1&type=动物 会出现热点限流)
- [2.快速访问 http://localhost:10004/news?id=2\&type=动物 不会出现热点限流](#2.快速访问 http://localhost:10004/news?id=2&type=动物 不会出现热点限流)
- 5.注意事项
-
- 3.系统规则
-
-
- 1.基本介绍
- 2.系统规则实例
-
- 1.需求分析
- 2.新增系统规则
- 3.进行配置
- 4.测试
-
- [浏览器快速访问 http://localhost:10004/t2(或者其他任意的资源) 都会进行热点限流](#浏览器快速访问 http://localhost:10004/t2(或者其他任意的资源) 都会进行热点限流)
-
- 4.全局限流处理类
- 5.fallback(统一处理java异常)
-
-
- 1.需求分析
- 2.具体实现
-
- 1.修改system接口,每五次抛出异常
- 2.编写全局异常处理类
- 3.system接口使用全局异常处理类处理异常
- 4.测试
-
- 1.打开nacos和sentinel
- 2.重启10004微服务
- 3.浏览器访问一下http://localhost:10004/system?id=test
- 4.Sentinel配置限流,这里就配置一个QPS流量控制
- 5.目前情况分析
- [6.访问五次 http://localhost:10004/system?id=test 成功交给全局异常处理类来处理](#6.访问五次 http://localhost:10004/system?id=test 成功交给全局异常处理类来处理)
-
1.熔断降级
1.基本介绍
1.线程堆积引出熔断降级
2.示意图
3.熔断,降级,限流三者之间的关系
2.熔断降级策略(以分钟为基本单位)
1.慢调用比例
- 进行熔断的条件是:慢调用的比例达到阈值,QPS大于最小请求数
- 待超过熔断时长后,如果还是满足熔断条件(慢调用的比例达到阈值,QPS大于最小请求数),则会继续进行熔断
2.异常比例
- 进行熔断的条件是:异常比例达到阈值,QPS大于最小请求数
- 待超过熔断时长后,如果还是满足熔断条件(异常比例达到阈值,QPS大于最小请求数),则会继续进行熔断
3.异常数
- 进行熔断的条件是:异常数达到阈值,QPS大于最小请求数
- 待超过熔断时长后,如果还是满足熔断条件(异常数达到阈值,QPS大于最小请求数),则会继续进行熔断
3.熔断降级实例---慢调用比例
1.需求分析
2.com/sun/springcloud/controller/MemberController.java 新增接口t3并休眠300ms
3.具体配置
1.重启10004微服务
2.查看注册情况
3.浏览器输入http://localhost:10004/t3发送请求
4.Sentinel点击降级
5.降级规则配置
- 这样当每秒钟的请求数 大于5,并且每分钟只要有一个是慢调用就进行熔断降级
4.测试
1.一秒超过五次请求http://localhost:10004/t3会发生熔断降级
2.等待10s,再次请求,虽然还是慢调用,但是小于最小请求数,所以不会发生熔断
5.熔断降级实例---异常比例
1.需求分析
2.com/sun/springcloud/controller/MemberController.java 新增接口t4并出现异常返回error
3.具体配置
1.重启10004微服务
2.查看注册情况
3.浏览器输入http://localhost:10004/t4
4.Sentinel点击降级
5.具体配置
- 这样配置表示当每秒钟的请求数达到5,并且**每分钟异常的比例大于20%**则会出现熔断降级
4.测试
1.一秒超过五次请求 http://localhost:10004/t4,发生熔断降级
2.五秒之后再次发送请求,降级解除
6.熔断降级实例---异常数
1.需求分析
2.还是使用掐面的t4接口即可
3.具体配置
- 这样,当吗,每秒钟的请求数 到达5,并且每分钟异常数量大于5,则会进行熔断降级
4.测试
1.一秒超过五次请求 http://localhost:10004/t4,由于每发生熔断降级
2.五秒之后再次发送请求,降级解除
2.热点限流
1.基本介绍
1.引出热点限流
2.示意图
3.上图解读
2.需求分析
3.具体配置
1.10004微服务的controller增加两个接口
被热点限流的接口
- 使用@SentinelResource注解来制定被热点限流的接口以及处理热点限流的接口
java
/**
* 测试热点限流
* @param id
* @param type
* @return
*/
@GetMapping("/news")
@SentinelResource(value = "news", blockHandler = "hot") // value为资源名可以任意指定,blockHandler为限流处理
public String news(@RequestParam("id") String id, @RequestParam("type") String type) {
return "id=" + id + " type=" + type;
}
处理热点限流的接口
- 接受的参数需要与被热点限流的接口的参数一致,并且有一个处理异常的参数
java
/**
* 热点限流处理
* @param id 与news方法的参数一致
* @param type 与news方法的参数一致
* @param blockException 限流处理的异常
* @return 注意:这里的返回值类型要与news方法的返回值类型一致
*/
public String hot(String id, String type, BlockException blockException) {
return "id" + id + "type" + type + "热点限流处理";
}
2.重启10004微服务,并启动Nacos和Sentinel
3.浏览器输入 http://localhost:10004/news?id=1\&type=动物
4.Sentinel查看热点接口
5.点击热点,进行基本配置
- 这个配置表示对参数id进行热点限流,只要每秒请求次数超过2就触发限流
6.保存后点击热点规则,编辑刚才的规则
7.点击高级选项,对参数的具体值进行额外配置
4.测试
1.浏览器快速访问 http://localhost:10004/news?id=1\&type=动物 会出现热点限流
- 原因是对参数id设置了热点限流的触发条件为每秒请求数为2
2.快速访问 http://localhost:10004/news?id=2\&type=动物 不会出现热点限流
- 原因是对参数id=2设置了热点限流的触发条件为每秒请求数为100
5.注意事项
1.热点参数可以设置多个值进行限流
2.处理热点限流的方法的返回值需要与被处理的方法相同
3.系统规则
1.基本介绍
1.引出系统规则
2.介绍
- 简单来说这个系统规则就是对整个系统的所有资源进行统一管理,共享一套限流规则!
2.系统规则实例
1.需求分析
2.新增系统规则
3.进行配置
- 这样配置就表示,整个系统的每秒请求数超过2就会进行限流
4.测试
浏览器快速访问 http://localhost:10004/t2(或者其他任意的资源) 都会进行热点限流
4.全局限流处理类
1.需求分析
2.具体实现
1.编写全局限流处理类
- 需要注意:方法必须是static,并且参数类型和返回的类型必须与被处理的方法一致
java
package com.sun.springcloud.handler;
import com.alibaba.csp.sentinel.slots.block.BlockException;
/**
* Description: 全局限流处理器,方法必须是static
*
* @Author sun
* @Create 2024/3/29 16:04
* @Version 1.0
*/
public class GlobalBlockHandler {
/**
* 全局限流处理器
*
* @param id 传入的参数
* @param e 异常
* @return 返回的结果,必须与被处理的方法返回值一致
*/
public static String blockHandler(String id, BlockException e) {
return "GlobalBlockHandler " + id + " 服务不可用";
}
}
2.编写一个接口进行测试
java
/**
* 全局限流测试
* @return
*/
@GetMapping("/system")
// @SentinelResource 注解中的value值为资源名 名字任意,blockHandlerClass为全局限流处理类,blockHandler为处理方法
@SentinelResource(value = "system", blockHandlerClass = GlobalBlockHandler.class, blockHandler = "blockHandler")
public String system(@RequestParam(value = "id", required = false) String id) {
return "id" + id + "全局限流未激活";
}
3.测试
1.重启10004模块
2.配置system接口的限流,这里就配置一个热点限流
3.浏览器快速访问 http://localhost:10004/system?id=test
5.fallback(统一处理java异常)
1.需求分析
2.具体实现
1.修改system接口,每五次抛出异常
java
private int count = 0;
/**
* 全局限流测试
* @return
*/
@GetMapping("/system")
// @SentinelResource 注解中的value值为资源名 名字任意,blockHandlerClass为全局限流处理类,blockHandler为处理方法
@SentinelResource(value = "system", blockHandlerClass = GlobalBlockHandler.class, blockHandler = "blockHandler",
fallbackClass = GlobalFallbackHandler.class, fallback = "fallbackHandlerMethod1")
public String system(@RequestParam(value = "id", required = false) String id) {
// 每调用5次就抛出异常
if (++ count % 5 == 0) {
throw new RuntimeException("出现异常!!!");
}
return "id" + id + "全局限流未激活";
}
2.编写全局异常处理类
- 方法需要是static
- 参数类型和返回类型与被处理的方法类型一致
java
package com.sun.springcloud.handler;
/**
* Description: 全局异常处理类,所有的方法都要是静态方法,参数类型和返回值类型也要与被处理的方法返回值相同
*
* @Author sun
* @Create 2024/3/29 16:33
* @Version 1.0
*/
public class GlobalFallbackHandler {
public static String fallbackHandlerMethod1(String id, Throwable throwable) {
return "fallback处理异常!" + "id:" + id;
}
}
3.system接口使用全局异常处理类处理异常
- 新增两个属性,一个是全局异常处理类的Class对象,一个是处理异常的方法
4.测试
1.打开nacos和sentinel
2.重启10004微服务
3.浏览器访问一下http://localhost:10004/system?id=test
4.Sentinel配置限流,这里就配置一个QPS流量控制
5.目前情况分析
- 正常情况:每秒请求数不超过2
- 限流情况:每秒请求数超过2,被全局限流处理类中的方法处理
- 异常情况:每5次抛出一次异常,交给全局异常处理器处理