本文共 2214 字,大约阅读时间需要 7 分钟。
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。由于调用关系的复杂性,如果调用链路中的某个资源不稳定,最终会导致请求发生堆积。Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出 DegradeException)。
RT(平均响应时间,秒级):
超出阈值
且在时间窗口内通过的请求大于5
两个条件同时满足后触发降级异常比例(秒级):
QPS >= 5
且异常比例(秒级统计)超过阈值时
,触发降级;异常数(分钟级):
异常数(分钟统计)超过阈值时
,触发降级Sentinel熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。
当资源降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断(默认行为是抛出DegradeException)。
注意:
Sentinel的断路器是没有半开状态的。
半开的状态系统自动去检测是否请求有异常,没有异常就关闭断路器恢复使用,有异常则继续打开断路器不可用。
Controller:
@GetMapping("/testD") public String testD() { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } log.info("testD 测试RT"); return "***********testD"; }
测试:JMeter
//测试异常比例 @GetMapping("/testE") public String testE() { log.info("testE 测试异常比例"); int age = 10 / 0; return "********testE"; }
测试:正常访问
单独访问一次,必然访问一次报错一次。开启jmeter后,直接高并发发送请求,多次调用达到配置条件。断路器开启,微服务不可用了,就不再报错而是服务降级了。
//测试异常数 @GetMapping("/testF") public String testF() { log.info("testF 测试异常比例"); int age = 10 / 0; return "********testF"; }
测试:正常访问
此时,再次访问testF,会失败:
转载地址:http://lppqb.baihongyu.com/