一、服务降级和服务熔断的区别
说下个人肤浅的认识。首先服务熔断和服务降级都是从可用性和可靠性出发为了防止系统崩溃而做的一系列策略。当服务异常时,为调用方提供一个已经预先设置好的返回结果。我认为服务熔断是服务降级的特殊形式,服务熔断比服务降级要智能。当外部的条件到达我们预先设置的一些条件(时间窗口、请求总数阈值、错误百分比阈值等)就会触发,服务熔断机制还会慢慢的恢复调用链路。
二、熔断三种状态
2.1 熔断打开:
请求不再请求当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长到达所设置时长则进入版熔断状态
2.2 熔断关闭:
熔断关闭不会对服务进行熔断处理
2.3 熔断半开:
部分请求根据请求规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复到正常状态,关闭熔断
三、涉及熔断器的三个总要参数
3.1 时间窗口:
断路器是否打开需要在一定时间内统计一些请求和错误数据,而统计的时间范围就是窗口时间,默认为10s。
3.2 请求总数阈值:
在窗口时间内,必须满足请求总数阈值才有熔断的资格,默认20次。意味着加入10s内,如果该Hysrix的命令的调用次数不足20次,即使所有的请求都出现异常,都不会触发熔断。
3.3 错误百分比阈值:
当请求总数在窗口时间内超过了阈值,比如:发生了30次调用,有15次发生了异常,也就是超过了50%的错误百分比,在默认值为50%的情况下,这个时候将会出发熔断。
四、使用
4.1 引入依赖、开启组件
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
@SpringBootApplication
@EnableHystrix //开启Hystrix
public class PaymentHystrixMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentHystrixMain8001.class, args);
}
}
4.2 调用、结果
这里paymentCircuitBreak方法接受一个id参数,当id<0是就会触发异常然后就会调用paymentCircuitBreakFallBack方法。当你狂调用paymentCircuitBreak方法时,达到@HystrixCommand中设置的阈值时。即使你下次调用时你的参数id>0也会进入FallBack,慢慢的服务才会恢复正常。
@HystrixCommand(fallbackMethod = "paymentCircuitBreakFallBack",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 String paymentCircuitBreak(Integer id) {
if (id < 0) {
throw new RuntimeException("id 不能为负数!!");
}
return "线程名:" + Thread.currentThread().getName() + "\t" + "调用成功!id:" + id;
}
public String paymentCircuitBreakFallBack(Integer id) {
return "id 不能为负数。请稍后再试!! id:" + id;
}
}
其他
1. 参考代码:https://github.com/TianLuhua/springCloud2020.git
2. 服务端 cloud-provider-hystrix-payment8001
3. @HystrixCommand中的参数可以参考:jar包Hystrix-core中的HystrixCommandProperties抽象类
4. 怎么使用Hystrix:https://github.com/Netflix/Hystrix/wiki/How-it-Works