多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
Sentinel断路器没有半开状态,所谓的半开状态是指系统自动去检测请求是否有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器不可用。 <br/> Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出`DegradeException`)。 <br/> :-: ![](https://img.kancloud.cn/23/a1/23a12e0ff3b89825f2d939684696965f_1889x716.png) **设置降级规则的地方** ![](https://img.kancloud.cn/9a/f2/9af2cb50f03cfe554d9bf5f3d301953b_850x398.png) **降级策略** * 资源名:降级规则的作用对象,唯一名称,默认为请求路径。 下面演示降级策略的效果。 **1. RT(秒级平均响应时间)** 触发RT降级需要同时满足两个条件:<mark>在1s时间内对同一个资源请求大于等于5次</mark>且<mark>在RT时间内如果还没有将请求处理完</mark>,则会触发RT降级。过了这1s,再过时间窗口(单位s)后方可取消RT降级。 <br/> (1)降级规则:如果在1s时间内请求`/testC`的次数大于等于5,并且在RT(200ms)的时间内没有将这1s内的请求处理完成,则触发RT降级。只有过了这1s的时间后,再过时间窗口的4s时间才会取消RT降级。 :-: ![](https://img.kancloud.cn/30/33/303381b5d7b91ecbf160dcff45f41adc_846x395.png) (2)设置处理一次`/testC`请求需要1s的时间。 ```java @RestController public class FlowLimitController { @RequestMapping("testC") public String testC() { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } return "testC 测试RT-------"; } } ``` (3)演示效果:我用jmeter在1s的时间内向`/testC`请求10次(已经超过Sentinel设定的5次了),并且在上一步规定处理每个请求需要1s的时间,但是10次请求我总共只给了200ms的时间,根本就处理不了,所以会触发RT降级,过了这1s,再过时间窗口的4s后才取消RT降级。 ![](https://img.kancloud.cn/dd/32/dd32c4083bc1248bb1ef11876e247bfb_1494x405.gif) <br/> **2. 异常比例** 触发异常比例降级需要同时满足两个条件:<mark>在1s时间内对同一个资源请求大于等于5次</mark>且<mark>这1s时间内通过异常请求的比例大于设置的异常比例</mark>(异常比例范围在`[0.0, 1.0]`,对应`[0%, 100%]`),则会触发异常比例降级。过了这1s,再过时间窗口(单位s)后方可取消异常比例降级。 <br/> (1)降级规则:如果在1s的时间内对`/testD`请求次数大于等于5,并且通过异常请求的比例大于设置的异常比例(0.2)则触发异常比例降级,过了这1s后,再过时间窗口的4s才取消异常比例降级。 ![](https://img.kancloud.cn/39/6e/396e858b1f6ca52ab142c925069b263c_850x395.png) (2)设置通过异常请求的比例为100%。 ```java @RestController public class FlowLimitController { @RequestMapping("/testD") public String testD() { //除数不能为0,这里会发生异常的 //如果异常被try/catch捕获不会触发异常比例降级 int age = 10 / 0; return "testD 测试异常比例降级-------"; } } ``` (3)演示效果:我用jmeter在1s时间内向`/testD`发送10次请求(已经超过Sentinel设定的5次了),并且每次请求都发生异常,即通过异常请求的比例为100%,已经超过设置的异常比例0.2了,所以异常比例降级被触发,当过了这1s,再过时间窗口的4s后,异常比例降级被取消。 ![](https://img.kancloud.cn/80/72/807256cf0e7f903e9ef0d75690a2fe39_1494x405.gif) <br/> **3. 异常数** 触发异常数降级的条件是:1min内对同一资源请求通过的异常次数大于设置的异常数,则会触发异常数降级。从这1min内最后一次请求开始计算,过了时间窗口(单位s)后才取消异常数降级。 <br/> 异常数降级的时间窗口以min计算,所以设置的时间窗口小于60s的话,可能会导致已经被取消异常数降级后又自动触发异常数降级。 <br/> (1)降级规则:如果1min内对`/testE`请求通过的异常次数大于设置的异常数5,则触发异常数降级。从这1min内的最后一次请求开始计算,过了时间窗口70s后异常数降级才被取消。 ![](https://img.kancloud.cn/e4/c9/e4c992e3a828e5a6be1c8ec10e3d7b69_847x400.png) (2)`/testE`请求。 ```java @RestController public class FlowLimitController { @RequestMapping("/testE") public String testE() { //除数不能为0,这里会发生异常的 //如果异常被try/catch捕获不会触发异常比例降级 int age = 10 / 0; return "testE 测试异常数降级"; } } ``` (3)演示效果:在1min内向`/testE`发出超过5次请求,每次请求都发生异常,超过了设置的异常数5,异常数降级被触发。从这1min内的最后一次请求开始计算,过了时间窗口70s后异常数降级才被取消。