1 优点
- 提供了各种策略帮助我们执行降级方法,快速失败,返回托底数据。
- Hystrix提供了两种隔离策略,避免Tomcat线程池耗尽。
- 提供了断路器,以一定的策略指定某一个功能快速失败。
- 提供了实时的监控界面。
2 Hystrix的降级
导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
在启动类中添加注解
@EnableCircuitBreaker
在Controller方法中添加注解
@HystrixCommand(fallbackMethod = "getByIdFallback")
public Customer getById(@PathVariable Integer id){........}
编写指定的fallback方法
public Customer getByIdFallback(@PathVariable Integer id){........}
3 Hystrix的隔离策略
- 为了避免容器的线程池耗尽
- 使用Hystrix自带的线程池(默认)
- 接收请求的线程和处理业务逻辑代码的线程不是一个,处理业务的线程是Hystrix的线程。
- 信号量策略
- 由信号量管理容器的线程池,出现了线程池耗尽,信号量也会执行快速失败。
4 Hystrix隔离策略的属性
- 线程池的属性:
- 超时时间的开关:
execution.timeout.enabled
:true - 超时时间的数值:
execution.isolation.thread.timeoutInMilliseconds
:1000 - 因超时导致任务失败,当前线程是否中断任务执行:
execution.isolation.thread.interruptOnTimeout
:true - 因取消任务导致任务失败,当前线程是否中断任务执行:
execution.isolation.thread.interruptOnCancel
:false - 信号量的属性:
指定属性配置:
@HystrixCommand(fallbackMethod = "getByIdFallback",
commandProperties = {
@HystrixProperty(name = "execution.isolation.strategy",value = "SEMAPHORE"),
@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1000"),
@HystrixProperty(name = "execution.timeout.enabled",value = "false"),
@HystrixProperty(name = "execution.isolation.thread.interruptOnTimeout",value = "false"),
@HystrixProperty(name = "execution.isolation.thread.interruptOnCancel",value = "true")
})
5 断路器
5.1 安装监控界面
导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
在启动类添加注解
@EnableHystrixDashboard
构建Servlet
@WebServlet("/hystrix.stream")
public class HystrixServlet extends HystrixMetricsStreamServlet{}
扫描Servlet注解
@ServletComponentScan("com.hqy.customer.servlet")
5.2 配置断路器信息
@HystrixCommand(fallbackMethod = "getByIdFallback",commandProperties = {
@HystrixProperty(name = "circuitBreaker.enabled",value = "true"), // 开启断路器
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold",value = "5"), // 10s内总请求数为5个,才计算断路器
@HystrixProperty(name = "circuitBreaker.sleepWindowInMilliseconds",value = "30000"), // open会持续30s
@HystrixProperty(name = "circuitBreaker.errorThresholdPercentage",value = "20")//请求失败率达到20%就open断路器
})
在断路器配置开启的前提下,在10s内,发起5个请求,如果失败率在20%,断路器就会Open,并且维持30s。
在断路器Open时,所有的请求都会直接返回托底数据。
当30s过后,断路器会达到Half_Open的状态,放行一个请求到达功能内部执行:
- 执行成功,断路器回到Closed状态,正常对外提供服务。
- 执行失败,断路器回到Open状态,维持30s。