- Hystrix在SpringCloud2020版本中正式移除,在进行版本升级的过程中就需要替换熔断组件,熔断组件的替换也比较简单因为Resilience4J已经加入到了SpringCloud的大家庭中,属于SpringCloudCircuitBreaker下的一员,所以在进行熔断组件的切换也是比较简单的
- 首先移除原有的SpringCloudHystrix的相关依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-cloud2</artifactId>
</dependency>
删除@EnableHystrix
- 配置文件的调整将feign.hystrix.enable删除,删除以hystrix.command开头的配置文件替换为CircuitBreaker
feign:
circuitbreaker:
enabled: true
- 以前的@FeginClient已经对应的熔断类不需要变更,需要注意的是指定fallBack时需要指定的是fallBackFactory属性
- 新增Resilience4J的配置文件
@Configuration
public class ReactiveResilience4JCircuitBreakerConfig {
@Bean
public Customizer<Resilience4JCircuitBreakerFactory> circuitBreakerFactory() {
//自定义断路器配置
CircuitBreakerConfig circuitBreakerConfig=CircuitBreakerConfig.custom() //
// 滑动窗口的类型为时间窗口
.slidingWindowType(CircuitBreakerConfig.SlidingWindowType.TIME_BASED)
// 时间窗口的大小为60秒
.slidingWindowSize(60)
// 在单位时间窗口内最少需要5次调用才能开始进行统计计算
.minimumNumberOfCalls(5)
// 在单位时间窗口内调用失败率达到70%后会启动断路器
.failureRateThreshold(70)
// 允许断路器自动由打开状态转换为半开状态
.enableAutomaticTransitionFromOpenToHalfOpen()
// 在半开状态下允许进行正常调用的次数
.permittedNumberOfCallsInHalfOpenState(5)
// 断路器打开状态转换为半开状态需要等待60秒
.waitDurationInOpenState(Duration.ofSeconds(60))
// 所有异常都当作失败来处理
.recordExceptions(Throwable.class)
.build();
return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
//超时规则,默认1s
.timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(20)).build())
//设置断路器配置
.circuitBreakerConfig(circuitBreakerConfig)
.build());
}
@Bean
public Resilience4jBulkheadProvider defaultBulkheadCustomizer() {
ThreadPoolBulkheadConfig threadPoolBulkheadConfig=ThreadPoolBulkheadConfig.custom()
//最大线程数
.maxThreadPoolSize(500)
//核心线程数
.coreThreadPoolSize(100)
//拒绝策略
.rejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy())
//线程存活时间
.keepAliveDuration(Duration.ofMillis(20L))
//队列大小
.queueCapacity(Integer.MAX_VALUE)
.build();
ThreadPoolBulkheadRegistry threadPoolBulkheadRegistry=new InMemoryThreadPoolBulkheadRegistry(threadPoolBulkheadConfig);
BulkheadConfig bulkheadConfig=BulkheadConfig.custom()
//最大并发数量
.maxConcurrentCalls(300)
//最大等待时间
.maxWaitDuration(Duration.ofMillis(500))
.build();
BulkheadRegistry bulkheadRegistry=new InMemoryBulkheadRegistry(bulkheadConfig);
return new Resilience4jBulkheadProvider(threadPoolBulkheadRegistry,bulkheadRegistry);
}
}