- 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)
.slidingWindowSize(60)
.minimumNumberOfCalls(5)
.failureRateThreshold(70)
.enableAutomaticTransitionFromOpenToHalfOpen()
.permittedNumberOfCallsInHalfOpenState(5)
.waitDurationInOpenState(Duration.ofSeconds(60))
.recordExceptions(Throwable.class)
.build();
return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
.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);
}
}