前言
Hystrix中文意思是豪猪,大家一想到豪猪,可能就想到浑身的刺,来保护自己。

Hystrix同样也是如此,具有熔断、降级、缓存、监控等多项功能,引用这个组件就是为了在当我们一个依赖包出现异常等时候,不影响其他任务的使用。
我们可能在项目或者实战中听说过Hystrix断路器相关使用,那么我们怎么用?在哪里用,如何用,如何和Fegin等结合起来,这是个问题。
使用背景

降级(fallBack)
当我们调用某个服务,比如调用影院系统的查询服务,如果出现以下场景:
- 服务超时
- 服务调用异常
- 线程池拒绝
- 断路器打开
1. 引入Hystrix相关依赖
首先,在项目的pom.xml
文件中添加Hystrix的依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
<version>2023.0.0</version>
</dependency>
2. 启用Hystrix
在Spring Boot启动类上添加@EnableHystrix
注解,以启用Hystrix的功能:
java
@SpringBootApplication
@EnableHystrix
public class MovieSystemApplication {
public static void main(String[] args) {
SpringApplication.run(MovieSystemApplication.class, args);
}
}
3. 配置Hystrix
在application.yml
中添加Hystrix的相关配置:
java
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 5000 # 设置默认超时时间为5秒
strategy:
maxConcurrentRequests: 10 # 设置默认的最大并发请求数
4. 实现降级逻辑
在需要降级的业务逻辑中使用@HystrixCommand
注解,并定义降级方法:
java
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
@Service
public class MovieService {
@HystrixCommand(fallbackMethod = "getDefaultMovie")
public Movie findMovieById(String movieId) {
// 调用实际的查询服务,可能会抛出异常或超时
return movieRepository.findById(movieId).orElseThrow(() -> new RuntimeException("Movie not found"));
}
// 降级方法,当服务调用失败时调用
private Movie getDefaultMovie(String movieId) {
// 返回一个默认的电影对象
return new Movie(
"0000",
"Default Movie",
"Default Description",
0.0
);
}
}
5. 测试降级功能
编写单元测试,模拟服务调用失败的情况,验证降级逻辑是否正确触发:
java
@RunWith(SpringRunner.class)
@SpringBootTest
public class MovieServiceTest {
@Autowired
private MovieService movieService;
@Test
public void testFallbackWhenServiceFails() {
Movie movie = movieService.findMovieById("nonexistentId");
assertEquals("Default Movie", movie.getTitle());
}
}
6. 验证降级行为
可以通过以下方式验证降级行为:
- 手动抛出异常 :在
findMovieById
方法中手动抛出一个异常,观察是否调用getDefaultMovie
方法。 - 断路器打开:通过多次调用失败的服务,触发断路器打开,验证降级逻辑是否生效。
- 超时测试 :在
findMovieById
方法中添加一个长时间运行的任务,触发超时,验证降级逻辑是否生效。
通过以上步骤,我们可以实现一个完整的Hystrix降级机制,确保在服务调用失败时能够返回默认值,提高系统的容错能力和用户体验。