Unable to find GatewayFilterFactory with name CircuitBreaker
起因
要在springCloudGateway中整合CircuitBreaker。
按照官网 https://cloud.spring.io/spring-cloud-gateway/reference/html/#spring-cloud-circuitbreaker-filter-factory 一步步操作
先添加依赖 spring-cloud-starter-circuitbreaker-reactor-resilience4j
然后做配置
竟然不好使。。。报错 Unable to find GatewayFilterFactory with name CircuitBreaker
查看源码后发现
这个ReactiveResilience4JCircuitBreakerFactory类没有生成。
是因为整合了alibaba 的spring cloud ,它里面已经有了一个实现。所以这个条件不满足导致。
解决办法,自己生成一个
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig; import io.github.resilience4j.timelimiter.TimeLimiterConfig; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.cloud.circuitbreaker.resilience4j.ReactiveResilience4JCircuitBreakerFactory; import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigBuilder; import org.springframework.cloud.client.circuitbreaker.Customizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.time.Duration; @Configuration @Slf4j public class GatewayCircuitBreakerConfig { @Bean @ConditionalOnMissingBean(ReactiveResilience4JCircuitBreakerFactory.class) public ReactiveResilience4JCircuitBreakerFactory reactiveResilience4JCircuitBreakerFactory() { log.warn("ReactiveResilience4JCircuitBreakerFactory 不存在,自己创建一个"); return new ReactiveResilience4JCircuitBreakerFactory(); } @Bean(name = "commonCustomizer") public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() { final CircuitBreakerConfig build = CircuitBreakerConfig.custom() .failureRateThreshold(5) // 失败率 .slidingWindowSize(100) // 每100个统计一次 .permittedNumberOfCallsInHalfOpenState(80) .slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED) .slowCallRateThreshold(50) // 如果慢响应的响应率超过了50%,也降级 .slowCallDurationThreshold(Duration.ofSeconds(1)) //slow query 5s .minimumNumberOfCalls(50) // 至少50 个以上才开始触发熔断 .build(); final TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(7)).build(); return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id) .circuitBreakerConfig(build) .timeLimiterConfig(timeLimiterConfig).build()); } }
posted on 2023-05-08 15:40 cococooder 阅读(363) 评论(0) 编辑 收藏 举报