springcloud -hystrix服务熔断机制

发布时间 2023-07-07 10:32:43作者: 你就学个JVAV?

服务熔断:就是在错误率达到规定百分比的时候会开启,然后隔断消费者和服务端,在不断访问提升正确率后将其关闭,回复调用链路 service hystrix-payment-order8001 增加方法

  
 //=========服务熔断
 @HystrixCommand(fallbackMethod = "paymentCircuitBreaker_fallback",commandProperties = {
     // 表示开启服务熔断
         @HystrixProperty(name = "circuitBreaker.enabled",value = "true"),
     // 表示请求次数
         @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "10"), 
     // 表示失败的时间范围 比如10秒内10此失败
         @HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "10000"),
     // 开启服务熔断的阈值百分比
         @HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "60"),
 })
 public String paymentCircuitBreaker(@PathVariable("id") Integer id)
 {
     if(id < 0)
     {
         throw new RuntimeException("******id 不能负数");
     }
     String serialNumber = IdUtil.simpleUUID();
 ​
     return Thread.currentThread().getName()+"\t"+"调用成功,流水号: " + serialNumber;
 }
 public String paymentCircuitBreaker_fallback(@PathVariable("id") Integer id)
 {
     return "id 不能负数,请稍后再试,/(ㄒoㄒ)/~~   id: " +id;
 }
 ​

增加controller测试

 @GetMapping("/payment/circuit/{id}")
 public String paymentCircuitBreaker(@PathVariable("id") Integer id)
 {
     String result = paymentService.paymentCircuitBreaker(id);
     log.info("****result: "+result);
     return result;
 }

熔断打开: 请求不再进行调用当前服务,内部设置时钟一般为MTTR(平均故障处理时间),当打开时长达到所设时钟则进入半熔断状态

熔断关闭 熔断关闭不会对服务进行熔断

熔断半开 部分请求根据规则调用当前服务,如果请求成功且符合规则则认为当前服务恢复正常,关闭熔断

 

 

 
1:再有请求调用的时候,将不会调用主逻辑,而是直接调用降级fallback。通过断路器,实现了自动地发现错误并将降级逻辑切换为主逻辑,减少响应延迟的效果。
 
2:原来的主逻辑要如何恢复呢?
对于这一问题,hystrix也为我们实现了自动恢复功能。
当断路器打开,对主逻辑进行熔断之后,hystrix会启动一个休眠时间窗,在这个时间窗内,降级逻辑是临时的成为主逻辑,
当休眠时间窗到期,断路器将进入半开状态,释放一次请求到原来的主逻辑上,如果此次请求正常返回,那么断路器将继续闭合,
主逻辑恢复,如果这次请求依然有问题,断路器继续进入打开状态,休眠时间窗重新计时。