1、安装依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
2、配置文件
spring:
application:
name: nacos80833
cloud:
sentinel:
transport:
port: 8719
dashboard: 127.0.0.1:9090
3、常用规则
常用名词:
(1)资源名:资源名称,也就是请求路径或者映射
(2)针对来源:对调用者进行限流
(3)阈值类型:QPS:每秒可处理的请求数;线程数:能使用的线程数
(4)流控模式:直接-到达条件后直接执行某个流控效果;关联:如果关联资源达到条件则限流自身;
(5)流控效果:快速失败-到达条件后直接返回失败结果;Warm Up-预热,到达到阈值后,进入规定时间的预热状态,预热阈值默认为3,过了预热时间后,阈值恢复到设定阈值;排队等待-到达阈值条件后,系统均匀排队,过了超时时间则返回失败
3.1 流控规则:针对资源的
QPS:每秒可处理的请求数
1)QPS-直接-快速失败:请求数达到阈值后直接返回失败信息
2)QPS-直接-Warm Up:到达到阈值后,进入规定时间的预热状态,预热阈值默认为3,过了预热时间后,阈值恢复到设定阈值
3)QPS-直接-排队等待: 到达阈值后,所有请求进行排队等待均匀通过,到到达超时时间后则返回失败。
4)QPS-关联-快速失败: 设定的规则对BB起作用,当请求bb到达阈值后,则AA也会被限制
5)线程数-直接:当线程数达到阈值后则进行失败操作
3.2 降级熔断:针对资源的,到达条件后,服务器停止运行一段时间,之后在启动,即让服务器歇一会儿。规则有3种:RT(平均响应时间),异常比例,异常数
3.3 系统规则:LOAD负载,RT,线程数,入口QPS,CPU使用率。
4、使用@SentinelResource注解
其中value表示资源别名;blockHandler表示到达限流条件后的处理函数(注意:参数和原函数一致,外加BlockException blockException异常);fallback代表出现异常后执行的函数(注意:参数和原函数一致);blockHandlerClass代表限制兜底所在的类;fallbackClass代表异常所在的类;exceptionsToIgnore代表忽略哪些异常。
4.1 新建BlockHandler类,放超过限制条件的处理函数
public class BlockHandler {
public static String sentinelUnionTestBlockHandler(BlockException blockException){
return "限流兜底";
}
}
4.2 新建ExceptionHandler类,放出现异常的处理兜底函数
public class ExceptionHandler {
public static String sentinelUnionTestFallback(){
return "业务异常";
}
}
4.3 控制器执行函数
@GetMapping("/sentinelUnionTest")
//@SentinelResource(value = "sentinelUnionTest",fallback = "sentinelUnionTestFallback",blockHandler = "sentinelUnionTestBlockHandler")
@SentinelResource(value = "sentinelUnionTest",fallbackClass = ExceptionHandler.class,fallback = "sentinelUnionTestFallback",blockHandlerClass = BlockHandler.class,blockHandler = "sentinelUnionTestBlockHandler")
public String sentinelUnionTest(){
int res=1/0;
return "OK";
}
4.4 或者写在同一个类内部(不推荐)
@GetMapping("/testHotKeyA")
@SentinelResource(value = "testHotKeyA",blockHandler = "blockTestHotKeyA")
public String testHotKeyA(@RequestParam("orderId") String orderId,@RequestParam("userId") String userId){
//热点规则测试代码
return "testHotKeyA";
}
public String blockTestHotKeyA(String orderId,String userId,BlockException blockException){
return "参数限流"+blockException.getMessage();
}
/**
* 业务异常测试
* @param params
* @return
*/
@GetMapping("/fallbackTest")
@SentinelResource(value = "fallbackTest",fallback = "fallbackTestHandler")
public String fallbackTest(String params){
int res=1/0;
return "fallback测试成功!";
}
public String fallbackTestHandler(String params){
//业务异常
return "业务异常";
}