慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
注意异常降级仅针对业务异常,对 Sentinel 限流降级本身的异常(BlockException)不生效。为了统计异常比例或异常数,需要通过 Tracer.trace(ex) 记录业务异常。示例:
Entry entry = null; try { entry = SphU.entry(key, EntryType.IN, key); // Write your biz code here. // <<BIZ CODE>> } catch (Throwable t) { if (!BlockException.isBlockException(t)) { Tracer.trace(t); } } finally { if (entry != null) { entry.exit(); } }开源整合模块,如 Sentinel Dubbo Adapter, Sentinel Web Servlet Filter 或 @SentinelResource 注解会自动统计业务异常,无需手动调用。
熔断器事件监听Sentinel 支持注册自定义的事件监听器监听熔断器状态变换事件(state change event)。示例:
EventObserverRegistry.getInstance().addStateChangeObserver("logging", (prevState, newState, rule, snapshotValue) -> { if (newState == State.OPEN) { // 变换至 OPEN state 时会携带触发时的值 System.err.println(String.format("%s -> OPEN at %d, snapshotValue=%.2f", prevState.name(), TimeUtil.currentTimeMillis(), snapshotValue)); } else { System.err.println(String.format("%s -> %s at %d", prevState.name(), newState.name(), TimeUtil.currentTimeMillis())); } }); 代码实现 //定义熔断资源和回调函数 @SentinelResource(value = "degrade_rule", blockHandler = "exceptionHandler") @GetMapping("degrade") fun ruleHello(): String { return "hello rule sentinel" } //降级方法 fun exceptionHandler(e: BlockException): String { e.printStackTrace() return "系统繁忙,请稍后!,降级" } @PostConstruct fun initDegradeRule() { //1、创建存放熔断规则的集合 val rules: ArrayList<DegradeRule> = ArrayList() //2、创建熔断规则 val rule: DegradeRule = DegradeRule() //设置熔断资源名称 rule.resource = "degrade_rule" //阀值 rule.count = 0.01 //降级的时间,单位S rule.timeWindow = 10 //设置熔断类型 /** * 当资源的平均响应时间超过阀值(DegradeRule中的count以毫秒为单位)之后,资源进入准降级状态。 * 然后持续进入5个请求,他们的RT都持续超过这个阀值, * 那么在接下来的时间窗口(DegradeRule中的timeWindow,以s秒为单位)之内 * 将抛出DegradeException */ rule.grade = RuleConstant.DEGRADE_GRADE_RT //3、将熔断规则存入集合 rules.add(rule) //4、加载熔断规则集合 DegradeRuleManager.loadRules(rules) } 黑白名单控制很多时候,我们需要根据调用来源来判断该次请求是否允许放行,这时候可以使用 Sentinel 的来源访问控制(黑白名单控制)的功能。来源访问控制根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。
调用方信息通过 ContextUtil.enter(resourceName, origin) 方法中的 origin 参数传入。
规则配置来源访问控制规则(AuthorityRule)非常简单,主要有以下配置项:
resource:资源名,即限流规则的作用对象。
limitApp:对应的黑名单/白名单,不同 origin 用 , 分隔,如 appA,appB。
strategy:限制模式,AUTHORITY_WHITE 为白名单模式,AUTHORITY_BLACK 为黑名单模式,默认为白名单模式。
示例