点击下载教程项目代码:netflix_hystrix_demo.zip
前面章节介绍的 Hystrix 实例中均使用 @EnableCircuitBreaker 注解开启断路器功能,但在 IDEA 中 @EnableCircuitBreaker 注解被提示不推荐使用,因为它的源码上面声明了 @Deprecated 注解。下面将介绍 @EnableHystrix 注解。
@EnableHystrix 是 Spring Cloud 提供的注解,用于在 Spring Boot 应用程序中启用 Hystrix 的功能。当你在主应用类或者配置类上添加这个注解后,Spring 会自动配置相关的 Hystrix 组件,包括线程池、断路器等,使得你的应用能够使用 Hystrix 来实现服务容错和降级。
@EnableHystrix 注解源码如下:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @EnableCircuitBreaker public @interface EnableHystrix { }
注意:@EnableHystrix 注解使用了 @EnableCircuitBreaker 注解进行修饰。
@EnableHystrix 和 @EnableCircuitBreaker 两个注解的功能都是用来激活 Hystrix 的功能。根据 @EnableHystrix 的源码可以发现,它继承了 @EnableCircuitBreaker,并对它进行了在封装。
如果你需要启动 Hystrix 功能,只需要在服务启动类加入 @EnableHystrix 注解即可,无须增加 @EnableCircuitBreaker 注解,本身 @EnableHystrix 注解已经涵盖了 @EnableCircuitBreaker 的功能。
当 @EnableHystrix 被启用后,Spring 会为带有 @HystrixCommand 注解的方法创建代理。这个代理会拦截方法的调用,并根据 Hystrix 的配置(如断路器状态、线程池状态等)来决定是正常执行方法还是执行降级策略。
当一个服务的请求失败率(如超过一定的阈值,通常是 50%)或者响应时间过长(超过配置的超时时间)达到一定条件时,断路器会打开。此时,后续的请求就不会再真正地调用该服务,而是直接执行降级方法,直到断路器检测到服务已经恢复正常,才会重新闭合,允许正常的请求调用。
注意,Hystrix 会为每个被 @HystrixCommand 注解标记的方法(或者一组相关方法)分配一个独立的线程池。这样可以防止一个服务的故障导致整个应用的线程资源耗尽。例如,如果一个服务出现了大量的长时间阻塞的请求,它只会占用自己线程池中的线程,而不会影响其他服务对应的线程池。