Sentinel 限流熔断
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, 1, 2,分别为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, 1, 2,分别表示响应时间,异常比例和异常数,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:资源在该时间内保持降级状态