13.Hystrix服务熔断
类比保险丝达到最大访问后,直接拒绝访问,拉闸限电,然后调用服务降级方法,返回友好提示!
服务降级===>进而熔断====>恢复调用链路
熔断机制概述:
熔断机制就是应对雪崩效应的一种微服务链路保护机制。当扇出链路的某个微服务出错不可用,或者想响应时间过长时
会进行服务降级,进而熔断该节点的微服务调用,快速返回错误的响应信息
当检测到该节点服务调用响应正常后,恢复调用链路
在srpingcloud框架中,熔断机制通过Hystrix实现,Hystrix会监控微服务间的调用状况
当失败的调用达到一定阈值,缺省是5秒20次调用失败,就会启动熔断机制,熔断机制的注解是@HystrixCommand
具体的实现代码如下:
重点1:HystrixCommand标签,以及熔断的状态:服务降级(返回友好提示信息)===>服务熔断(服务无法正常访问,返回友好错误信息)=====>恢复调用链路
@HystrixCommand(
fallbackMethod = "getCurrentThread_fallback",
commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"),//是否开启断路器
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"),//请求次数
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),//时间窗口期
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60")//失败率达到多少后跳闸
/*
1.服务降级==>服务熔断:上述配置的意思是:在一个窗口期(10秒内),调用量超过10次,并且失败率达到了60%,会进行服务熔断,这时候短路器处于全开状态(保险丝的全开)
服务熔断后,即使访问正确的过来,也会返回错误结果
2.断路器半开:慢慢的,有部分请求,当检测到服务节点返回正常时(断路器处于半开状态,放部分请求过去,看是否返回正常结果)
3.恢复调用链路:发现可以正常调用了,就闭合保险丝
*/
}
)
@GetMapping("/producer/getCurrentThread/{id}")
public String getCurrentThread(@PathVariable("id")int id){
if (id<0){
throw new RuntimeException("$$$$$$$$$$ id不能为负数");
}
String uuid= IdUtil.simpleUUID();
return Thread.currentThread().getName()+" 调用成功!流水号:"+uuid;
}
//重点2:服务降级方法
public String getCurrentThread_fallback(int id){
return "id:"+id+" 不能为负数,请稍后重试,/(ㄒoㄒ)/~~";
}
场景总结:
上述设置是:传入的id值不能为负数,要不会进行服务降级,当错误率在10秒钟,10次访问以上,错误率达到60%以上,会进行服务熔断,
这时即使传过来正数参数,也会返回服务降级方法,但慢慢当访问参数为正时,又会恢复链路调用,即正数返回正确的返回!
服务熔断总结:
熔断类型:
1.熔断打开:请求不再进行调用当前服务,内部设置始终一半为MTTR(平均故障处理时间),当打开时长达到所设始终则进入版熔断状态
2.熔断关闭:熔断关闭,不会对服务进行熔断
3.熔断半开:部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断