解析SpringCould中的Hystrix

一、简介

源码地址:https://gitee.com/xiaocheng0902/my-cloud.git

1,定义

  Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等。Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。

  "断路器"本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方无法处理的异常,这样就保证了服务调用方的线程不会被长时间的、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。

2,作用 

a)服务降级

  服务降级是从整个系统的负荷情况出发和考虑的,对某些负荷会比较高的情况,为了预防某些功能(业务场景)出现负荷过载或者响应慢的情况,在其内部暂时舍弃对一些非核心的接口和数据的请求,而直接返回一个提前准备好的fallback(退路)错误处理信息。这样,虽然提供的是一个有损的服务,但却保证了整个系统的稳定性和可用性

 b)服务熔断

  服务熔断的作用类似于我们家用的保险丝,当某服务出现不可用或响应超时的情况时,为了防止整个系统出现雪崩,暂时停止对该服务的调用。

 c)熔断vs降级

3,使用依赖

<!--新增hystrix-->
<dependency>
 <groupId>org.springframework.cloud</groupId>
 <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
 <version>2.2.1.RELEASE</version>
</dependency>

二、服务降级

1,服务提供者(自身)

对应源码:cloud-provider-hystrix-payment8001

  在主启动类Application上注解

@EnableCircuitBreaker

  在service的方法中加入

//主方法
@HystrixCommand(fallbackMethod = "paymentInfo_TimeOutHandler",commandProperties = { //出現超時,异常调用fallbackMethod方法
  @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "http://www.cppcns.com/ruanjian/java/3000") //3秒钟以内就是正常的业务逻辑
})
public String paymentInfo_TimeOut(Integer id){
 int timeNumber = 5; //1 的时候为正常执行当前方法
 //throw new RuntimeException(); //异常情况会直接跳过进入paymentInfo_TimeOutHandler
 try { TimeUnit.SECONDS.sleep(timeNumber); }catch (Exception e) {e.printStackTrace();}
 return "线程池:"+Thread.currentThread().getName()+" paymentInfo_TimeOut,id: "+id+"\t"+"呜呜呜"+" 耗时(秒)"+timeNumber;
}

//备选方法
public String paymentInfo_TimeOutHandler(Integer id){
 return "线程池:"+Thread.currentThread().getName()+" 系统繁忙, 请稍候再试 ,id: "+id+"\t"+"哭了哇呜";
}

2,服务调用者(fegin消费者)

对应源码:cloud-consumer-feign-hystrix-order80

  yaml文件中添加配置

feign:
 hystrix:
 enabled: true #如果处理自身的容错就开启。开启方式与生产端不一样。
 client:
 config:
  default:
  connectTimeout: 5000 # feign 的超时设置
  readTimeout: 5000 #同时配置一下feign的读取 超时
#超时时间配置,此处全局超时配置时间大于@HystrixProperty配置时间后,@HystrixProperty注解中的超时才生效
hystrix:
 command:
 default:
  execution:
  isolation:
   thread:
   timeoutInMilliseconds: 10000

  主启动类Application上加上注解

@EnableHystrix

  业务类controller中加入

//主方法
@GetMapping("/consumer/payment/hystrix/timeout/{id}")
@HystrixCommand(fallbackMethod = "paymentTimeOutFallbackMethod",commandProperties = {
  @HystrixProperty(name="execution.isolation.thread.timeoutInMilliseconds", value="http://www.cppcns.com/ruanjian/java/1500")//1.5秒钟以内就是正常的业务逻辑
})
public String paymentInfo_TimeOut(@PathVariable("id") Integer id){
 String result = paymentHystrixService.paymentInfo_TimeOut(id);
 return result;
}

//备用方法
public String paymentTimeOutFallbackMethod(@PathVariable("id") Integer id){
 return "我是消费者80,对付支付系统繁忙请10秒钟后再试或者自己运行出错请检查自己,(┬_┬)";
}

3,全局服务降级(feign消费端)

解析SpringCould中的Hystrix

扫一扫手机访问