1.说明
记录一下使用sentinel-dashboard 页面添加规则和使用代码配置规则的等效方式,对于每种规则怎么使用,有什么效果的话,这里就不赘述了
2.添加maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
3.启动sentinel dashboard,从页面修改sentinel配置参数
下载sentinel dashboard,这里使用1.8.0的版本测试
下载完成后,从命令行启动
java -jar sentinel-dashboard-1.8.0.jar
完成后打开http://127.0.0.1:8080/ 用户名密码默认都为sentinel
这个时候登录进去后,会看不到有需要配置规则的资源,需要先进去访问以下对应的接口,才能生成对应的节点
4.流控规则配置
4.1.QPS测试
添加接口
@GetMapping("/rule/flow/qps")
@SentinelResource(value = "qps", blockHandler = "qpsBlockHandler")
public String qps() {
return "Flow CTRL QPS";
}
public String qpsBlockHandler(BlockException ex) {
ex.printStackTrace();
return "QPS Block ......";
}
blockHandler指定qpsBlockHandler,当触发流控的时候,就会调用下面的qpsBlockHandler
- 配置流控规则 方式一:在sentinel dashboard中配置规则
先调用一下/rule/flow/qps,让dashboard 加载资源
其中qps这个节点名是在上面@SentinelResource 里面的value 定义的
点击➕流控后,在弹出的页面设置流控规则,这里选择QPS,阈值时2,代表1秒内超过2次调用就会抛出异常
- 配置流控规则 方式二:在代码中初始化规则
@PostConstruct
private static void init() {
List<FlowRule> flowRules = new ArrayList<>();
/**
* 流控模式:QPS
*/
FlowRule qpsRule = new FlowRule();
qpsRule.setResource("qps");
qpsRule.setCount(1);
qpsRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
flowRules.add(qpsRule);
FlowRuleManager.loadRules(flowRules);
}
@PostConstruct代表这个类初始化的时候执行 创建规则列表flowRules,并最后加载到FlowRuleManager 流控规则管理器里面,启动项目后,可以做到和页面配置一样的效果
最终1秒内多次调用浏览器的效果如下
4.2.线程数测试
添加接口
@GetMapping("/rule/flow/thread")
@SentinelResource(value = "thread", blockHandler = "threadBlockHandler")
public String thread() throws InterruptedException {
Thread.sleep(4000);
return "Flow CTRL Thread";
}
public String threadBlockHandler(BlockException ex) {
ex.printStackTrace();
return "Thread Block ......";
}
-
配置流控规则 方式一:在sentinel dashboard中配置规则
-
配置流控规则 方式二:在代码中初始化规则
@PostConstruct
private static void init() {
List<FlowRule> flowRules = new ArrayList<>();
/**
* 流控模式:綫程數
*/
FlowRule threadRule = new FlowRule();
threadRule.setResource("thread");
threadRule.setCount(1);
threadRule.setGrade(RuleConstant.FLOW_GRADE_THREAD);
flowRules.add(threadRule);
FlowRuleManager.loadRules(flowRules);
}
4.3.流控规则的高级选项配置对照
对应选项设置,等效的代码配置如下
FlowRule refRule = new FlowRule();
refRule.setResource("/rule/flow/ref");
//閾值類型:FLOW_GRADE_QPS=訪問數 ,FLOW_GRADE_THREAD=綫程數
refRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
//流控效果 : CONTROL_BEHAVIOR_DEFAULT=快速失敗, CONTROL_BEHAVIOR_WARM_UP=預熱,CONTROL_BEHAVIOR_RATE_LIMITER=排隊等候
refRule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_DEFAULT);
//流控模式:STRATEGY_DIRECT=直接 ,STRATEGY_RELATE=關聯 , STRATEGY_CHAIN=鏈路
refRule.setStrategy(RuleConstant.STRATEGY_RELATE);
// refRule.setWarmUpPeriodSec(15);//設置為預熱后 ,該位置代表為预热时长
// refRule.setMaxQueueingTimeMs(600);//設置為排隊等候后,該位置代表超時時間
refRule.setCount(1);
refRule.setRefResource("/rule/flow/ref2");
flowRules.add(refRule);
5.降级规则配置
添加接口
@GetMapping("/rule/degrade")
@SentinelResource(value = "degrade", blockHandler = "degradeHandler")
public String degrade() {
throw new RuntimeException("test");
}
public String degradeHandler(BlockException ex) {
ex.printStackTrace();
return "Degrade Block......";
}
blockHandler指定degradeHandler,当触发流控的时候,就会调用下面的degradeHandler
- 配置降级规则 方式一:在sentinel dashboard中配置规则
其中degrade这个节点名是在上面@SentinelResource 里面的value 定义的
- 配置降级规则 方式二:在代码中初始化规则
@PostConstruct
private static void init() {
List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule();
rule.setResource("degrade");
rule.setGrade(2); // 0 表示 RT,1 表示异常比例,2 表示异常数
// rule.setSlowRatioThreshold(0.5);
rule.setCount(1); // 阈值,根据 grade 的不同含义不同
rule.setTimeWindow(10); // 熔断时长,单位为秒
rules.add(rule);
DegradeRuleManager.loadRules(rules);
}
@PostConstruct代表这个类初始化的时候执行 创建规则列表rules,并最后加载到DegradeRuleManager 降级规则管理器里面,启动项目后,可以做到和页面配置一样的效果
6.系统规则配置
等效的代码配置如下
@PostConstruct
public void init() {
List<SystemRule> rules = new ArrayList<>();
SystemRule rule = new SystemRule();
rule.setHighestSystemLoad(10.0); // 设置系统的最高负载,例如 CPU 负载阈值
rule.setAvgRt(500); // 设置平均响应时间阈值
rule.setMaxThread(1000); // 设置最大并发线程数阈值
rule.setQps(100);
rule.setHighestCpuUsage(0.3);
rules.add(rule);
SystemRuleManager.loadRules(rules);
}