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编辑  收藏  举报