最近在看springcloud,发现服务熔断和服务降级这两个东西真的好像啊,翻来覆去看了几遍,貌似get了一点点区别
这两其实目的都是为了解决微服务系统间调用失败而导致的长期资源占用与浪费的,那为什么要防止这类问题呢?首先要了解“服务雪崩”的概念
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其它的微服务,这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”.
为了解决这种问题,提出了服务熔断和服务降级。
最先需要明确的是:服务熔断针对服务端,服务降级针对客户端
服务熔断是在调用成功的情况下,服务端内部出现错误而调用降级逻辑的过程
服务降级发生在调用不成功,即服务器响应超时或宕机的情况下,客户端发现调用不成功后,自动调用客户端本地的一个降级逻辑。
服务熔断触发流程
如果用户发了很多请求,并且调用的时候失败很多次,达到了熔断的条件,那么就会触发熔断,让降级逻辑变为主逻辑,所以在熔断的时候,就算你此次调用会成功,也会触发降级逻辑。过了一定的时间,状态会变为半开,此次如果有请求被正确调用,那么熔断就直接关闭了。如果此次请求还是不成功,那么再次变为熔断状态,过一会儿再半开,这样循环。
配置服务熔断
@HystrixCommand(fallbackMethod="processHystrix_Get", 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")//失败率达到多少后跳闸
})
public Dept get(@PathVariable(