什么是熔断器
一句话就是家里的保险丝。
代码实现
使用注解 @HystrixCommand
实现熔断器。
/**
* 服务熔断
* 在时间窗口期内如果又可以了,那么再次打开开关
* @param id ID
* @return 返回提示信息
*/
@HystrixCommand(fallbackMethod = "paymentCircuitBreakerFallback",
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 paymentCircuitBreaker(Integer id) {
if (id < 0) {
throw new RuntimeException("Id不能为负数!");
}
return "调用成功";
}
public String paymentCircuitBreakerFallback(Integer id) {
return "Id 不能为负数,请稍后再试: id = " id;
}
其中 paymentCircuitBreakerFallback
是熔断触发后要执行的方法。
熔断器在什么时候起作用?
熔断器的特点:
- 如果多次请求错误,然后慢慢的请求真确,也还是访问不到,因为他需要达到一定的正确率才会重新接上熔断的结果。
熔断器开启和关闭的条件:
- 当满足一定阀值的时候(默认 10 秒内超过 20 个请求次数);
- 当失败率达到一定的时候(默认 10 秒内超过 50% 请求失败);
- 到达以上阀值,断路器将会开启;
- 当开启的时候,所有请求都不会进行转发,而是执行 服务降级方法 ;
- 一段时间之后(默认是 5 秒),这个时候断路器是 半开状态 ,会 让其中一个请求进行转发 。如果成功,断路器会关闭,若失败,继续开启。重复 4 和 5 。
@HystrixCommand
注解完整的配置信息如下: