ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
在服务端 cloud-provider-hystrix-payment8001 进行演示。 <br/> **1. 在需要熔断的方法上标注注解`@HystrixCommand`** ```java /** * @DefaultProperties注解可以为当前类提供一个通用的异常处理方法 * 当注解 @HystrixCommand(fallbackMethod ="..")没有指定具体的 fallbackMethod 时 * 发生异常时就会调用 defaultFallback 指定的方法进行后续处理。 */ @DefaultProperties(defaultFallback = "paymentGlobalFallback") @Service public class PaymentServiceImpl implements PaymentService { @Override @HystrixCommand( //当调用方法paymentCircuitBreaker失败,则会调用方法paymentCircuitBreakerFallback进行后续处理 fallbackMethod = "paymentCircuitBreakerFallback" , commandProperties = { //true:开启断路器 @HystrixProperty(name = "circuitBreaker.enabled", value = "true"), //当请求次数超过10次时才进行熔断 @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"), //时间窗口期为10000ms @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds", value = "10000"), //失败率达到%60后跳闸 @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage", value = "60"), }) public String paymentCircuitBreaker(Integer id) { if (id < 0) { throw new RuntimeException("id不能为负数!"); } String simpleUUID = IdUtil.simpleUUID(); return Thread.currentThread().getName() + "," + "成功调用,流水号是:" + simpleUUID; } /** * 该方法的参数列表要与方法paymentCircuitBreaker一模一样。 */ public String paymentCircuitBreakerFallback(Integer id) { return "id不能为负数,请稍后再试...,id=" + id; } public String paymentGlobalFallback() { return "payment server exception!"; } } ``` **2. 测试效果** 每次调用失败就会执行方法`paymentCircuitBreakerFallback`,而不是执行业务方法`paymentCircuitBreaker`。如果在10000ms的时间内,调用方法`paymentCircuitBreaker`有超过60%比例调用失败,那么在5s的时间窗口内,即使访问正确也不会调用业务方法`paymentCircuitBreaker`,只有超过5s的时间窗口并且也是正确访问时才会被正确调用。 <br/> **断路器开启或关闭的条件如下:** * 开启的条件:当满足下面两个条件之一断路器就会开启。 * (1)当达到一定的阈值的时候(默认10秒钟超过20个请求次数)。 * (2)当失败率达到一定的时候(默认10秒内超过50%的请求次数)。 * 关闭条件:断路器开启之后(默认5秒),这个时候断路器是半开状态,会让其他一个请求进行转发,如果成功,断路器会关闭;若失败,继续开启。