一、什么是熔断(发生异常的托底)
熔断机制是对服务链路的保护机制,如果链路上的某个服务不可访问,调用超时,发生异常等,服务会触发降级返回托底数据,然后熔断服务的调用(失败率达到某个阀值服务标记为短路状态),当检查到该节点能正常使用时服务会快速恢复。
简单理解就是当服务不可访问了或者服务器报错了或者服务调用超过一定时间没返回结果,就立马触发熔断机制配合降级返回预先准备的兜底数据返回,不至于长时间的等待服务的相应造成大量的请求阻塞,也不至于返回一些错误信息给客户端,而是返回一些兜底数据。
服务器发生熔断之后,在一定时间后会对其进行重试,如果仍然是异常状态,则继续熔断,并且反复的重试,如果返回正常,则服务器取消熔断状态。
二、Sentinel熔断
Sentinel的服务熔断机制会对调用链上的某个不稳定(宕机,异常,超时)的资源,做出请求限制,快速失败,避免影响到其它的服务而导致级联错误。资源熔断后,在后续的一定时间(时间窗口)之内,对该服务的请求都自动熔断,抛出 DegradeException异常。
三、Sentnel熔断实例
一.资源熔断降级
// 限流,参数和返回值与源方法一致public User exceptionHandler(@PathVariable Long id, BlockException ex) {
ex.printStackTrace();System.out.println("服务限流");return new User(-1L,"限流了","限流了");}// 熔断public User getByIdfallback(@PathVariable Long id){
System.out.println("熔断降级");return new User(id,"zs:"+id, "熔断托底了");}@GetMapping("/user/{id}")//限流降级//@SentinelResource(value="user",blockHandler="exceptionHandler")@SentinelResource(value="user",blockHandler="exceptionHandler",fallback = "getByIdfallback")public User getById(@PathVariable Long id){
int i = (int) (1 / id); //方法异常,触发熔断return new User(id,"zs:"+id, "我是zs");}
二.资源熔断降级
三.熔断测试
http://localhost:8401/user/1
http://localhost:8401/user/0
先调用user/1刷高请求数量,再调用user/0两次达到异常数,调用user/0发生异常的时候就会调用熔断的兜底方法:fallback = “getByIdfallback”,之后就会进行服务限流,无论调用user/1或者user/0都会调用blockHandler="exceptionHandler"限流的兜底方法,过了四秒之后,服务会重新尝试去回复,此时调用user/1会是正常的数据返回。
四、Sentnel熔断策略(1.8.2)
一.慢调用比例
1、资源名
@SentinelResource(value="user",blockHandler="exceptionHandler",fallback = "getByIdfallback")
中的value
2、最大RT:最大响应时间
最大的响应时间,Sentinel 默认统计的 RT 上限是 4900 ms
3、比例阈值(取值范围0.0-1.0)
慢调用统计数对于最小请求数的占有比例;
4、熔断时常
设置熔断时间,超过熔断时间后,服务器会尝试着进行恢复
5、最小请求数
触发熔断的最小请求数目,若当前统计窗口内的请求数小于此值,即使达到了熔断条件也不会触发;
6、统计时长
统计时间段,相当于可以自定义单位时长。
二.异常比例
三.异常数
1、异常数
发生异常的数量