Sentinel 限流熔断

发布时间 2023-07-03 16:06:34作者: 龙之谷2019
 1 流控规则:
 2 
 3     [
 4         {
 5             "resource": "sentinel-resource",
 6             "controlBehavior": 0,
 7             "count": 1,
 8             "grade": 1,
 9             "limitApp": "default",
10             "strategy": 0
11         }
12     ]
13 
14     resource: 资源名称,为SentinelResource注解中value属性值
15     controlBehavior: 控制行为,分别为0:直接拒绝, 1:预热, 2:比例限制, 3:预热+比例限制
16     count: 线程数或者GPS数
17     grade: 流控的门槛类型 (0: 线程数, 1: QPS)
18     limitApp: 被限制的应用名,一般为上游服务名
19     strategy: 调用链的流控策略, 可取0, 12,分别为STRATEGY_DIRECT,STRATEGY_RELATE,STRATEGY_CHAIN
20     
21     
22 降级规则:
23 
24     [
25         {
26             "resource": "sentinel-resource",
27             "count": 2,
28             "grade": 0,
29             "passCount": 0,
30             "timeWindow": 10
31         }
32     ]
33     此处grade可取值0, 12,分别表示响应时间,异常比例和异常数,timeWindow表示时间窗口内拒绝访问

 

 1 流量控制规则
 2 
 3 private void initFlowQpsRule() {
 4     List<FlowRule> rules = new ArrayList<>();
 5     FlowRule rule = new FlowRule(resourceName);
 6     // set limit qps to 20
 7     rule.setCount(20);
 8     rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
 9     rule.setLimitApp("default");
10     rules.add(rule);
11     FlowRuleManager.loadRules(rules);
12 }
 1 熔断降级规则
 2 
 3 private void initDegradeRule() {
 4     List<DegradeRule> rules = new ArrayList<>();
 5     DegradeRule rule = new DegradeRule();
 6     rule.setResource(KEY);
 7     // set threshold RT, 10 ms
 8     rule.setCount(10);
 9     rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
10     rule.setTimeWindow(10);
11     rules.add(rule);
12     DegradeRuleManager.loadRules(rules);
13 }

使用:

1、初始化规则,通过下面代码导入规则内容,一个资源可以有多个规则

1      for (RateLimiterConfig rateLimiterConfig : rateLimiterConfigs) {
2             FlowRule flowRule = new FlowRule();
3             flowRule.setResource(rateLimiterConfig.getUrl());
4             flowRule.setCount(rateLimiterConfig.getCount());
5             flowRule.setGrade(rateLimiterConfig.getGrade());
6             flowRules.add(flowRule);
7         }
8    FlowRuleManager.loadRules(flowRules);

 

2、在对controller切面中执行1 Entry entry = null;

2   try {
3          entry = SphU.entry(url);
4        } catch (BlockException e) {
5            //TODO 资源访问阻止,被限流或被降级 在此处进行相应的处理操作
6   } finally {
     if (entry != null) {
         entry.exit();
     }
    
  }

 

 1 [
 2   {
 3     "resourceName": "/XXXURL",
 4     // 限流配置 针对服务提供的接口进行限流操作,可以配置返回的消息 基于单机QPS
 5     "limitingConfig": {
 6       // 最大QPS数
 7       "count": 70,
 8       // 0 - 直接拒绝 1 - 预热模式 2 - 匀速器
 9       "controlBehavior": 2,
10       // 预热模式下 预热时间s达到QPS最大值
11       "warmUpPeriodSec": 10,
12       // 匀速器模式下的等待队列超时时间ms
13       "maxQueueingTimeMs": 20000,
14       // 接口限流后的响应信息
15       "returnMessage": "异常"
16     }
17   }
18 ,
19 {
20     "resourceName": "/XXXURL",
21     // 限流配置 针对服务提供的接口进行限流操作,可以配置返回的消息 基于单机QPS
22     "limitingConfig": {
23       // 最大QPS数
24       "count": 8,
25       // 接口限流后的响应信息
26       "returnMessage": "异常"
27     }
28   }
29 ,
30  {
31     "resourceName": "/XXXURL",
32     // 限流配置 针对服务提供的接口进行限流操作,可以配置返回的消息 基于单机QPS
33     "limitingConfig": {
34       // 最大QPS数
35       "count": 70,
36       // 0 - 直接拒绝 1 - 预热模式 2 - 匀速器
37       "controlBehavior": 2,
38       // 预热模式下 预热时间s达到QPS最大值
39       "warmUpPeriodSec": 10,
40       // 匀速器模式下的等待队列超时时间ms
41       "maxQueueingTimeMs": 20000,
42       // 接口限流后的响应信息
43       "returnMessage": "异常"
44     }
45   }
46 ]

 

阿里Sentinel中间件:

限流:通过FlowRule,调用FlowRuleManager.loadRules(list);   list:List<FlowRule>

配置:

resource:资源名称,一般为http接口名
count:RT阈值或异常比阈值计数。
grade:降级策略(0:平均RT, 1:异常比率)。RT:平均响应时间

降级:通过DegradeRule,调用DegradeRuleManager.loadRules(list);   list:List<DegradeRule>

Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。

配置:

resource:资源名称,一般为http接口名
count:QPS大小
grade:流量控制的阈值类型(0:线程数,1:QPS)。
timeWindow:资源在该时间内保持降级状态