服务熔断是什么?
服务熔断对应处理的现象是服务雪崩。当服务不可用或是响应时间过长,会进行服务降级,并对该节点进行熔断,后续检测到该节点微服务调用响应正常后,恢复链路的调用。
(其实服务熔断可以看作是服务降级的一种特殊操作)
服务雪崩是因为微服务架构中多服务中存在依赖关系,有时候因为网络关系,或者服务器原因造成服务不稳定,导致服务调用失败。这种服务故障会有A影响到B,再影响到C,像滚雪球一样,造成雪崩效应。
示例:
@HystrixCommand(fallbackMethod = "default_fallback_his",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"),//失败率达到多少后跳闸
})
快照时间窗为统计的时间窗口,为当前的最近10秒。
其中,default_fallback_his为自己定义的异常抛出方法
public String default_fallback_his(xxx默认参数xxx){
return "xxxx";
或者是
throw new TimeoutException(ResponseCode.xxx定义错误码xxx);
}
顺便说一下熔断和降级的区别
- 触发原因不一样:服务熔断由链路上某个服务不可用引起的,服务降级是从整体的负载考虑
- 管理目标层次不一样:服务熔断是一个框架层次的处理,服务降级是业务层次的处理
- 实现方式不一样:服务熔断一般是自我熔断恢复,服务降级相当于人工控制
服务熔断是服务降级的一种特殊情况,他是防止服务雪崩而采取的措施。系统发生异常或者延迟或者流量太大,都会触发该服务的服务熔断措施,链路熔断,返回兜底方法。这是对局部的一种保险措施。
服务降级是对系统整体资源的合理分配。区分核心服务和非核心服务。在面对服务器压力激增时的一种全局性的考量,牺牲掉一些非核心的服务,使其不可访问或是延迟,保证核心服务的正常运行,实现对系统整体负荷进行管理。(常见大促活动)
总结
限流:限制并发的请求访问量,超过阈值则拒绝;
降级:服务分优先级,牺牲非核心服务(不可用),保证核心服务稳定;从整体负荷考虑;
熔断:依赖的下游服务故障触发熔断,避免引发本系统崩溃;系统自动执行和恢复