美文网首页框架
Spring Cloud Gateway 使用 Resilien

Spring Cloud Gateway 使用 Resilien

作者: 小波同学 | 来源:发表于2023-02-28 16:31 被阅读0次

    环境配置

    引入jar

    <!--resilience4j-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
    </dependency>
    <!--resilience4j 配置文件支持,版本需要和Spring cloud中的匹配-->
    <dependency>
        <groupId>io.github.resilience4j</groupId>
        <artifactId>resilience4j-spring-boot2</artifactId>
        <version>1.1.0</version>
    </dependency>
    

    状态项

    三个一般性状态

    • CLOSED:关闭状态,放过所有请求,记录请求状态。
    • OPEN:打开,异常请求达到阀值数量时,开启熔断,拒绝所有请求。
    • HALF_OPEN:半开,放开一定数量的请求,重新计算错误率。

    两个特定状态

    • DISABLED:禁用
    • FORCED_OPEN:强开

    状态转换

    • 1、启动时断路器为CLOSE状态
    • 2、达到一定请求数后计算请求失败率,达到或高于指定失败率后,断路进入open状态,阻拦所有请求
    • 3、开启一段时间(自定义)时间后,断路器变为halfOpen状态,重新计算请求失败率。
    • 4、halfOpen错误率低于指定失败率后,断路进入close状态,否则进入open状态
    • 5、循环....1-4.

    使用

    yml配置

    resilience4j.circuitbreaker:
      configs: #通用配置
        default: # 断路器系统默认配置
          #失败率,错误率达到或高于该值则进入open状态
          failureRateThreshold: 50
          #慢调用阀值,请求执行的时间大于该值时会标记为慢调用
          slowCallDurationThreshold: 60s
          #慢调用熔断阀值,当慢调用率达到或高于该值时,进入open状态
          slowCallRateThreshold: 100
          #状态滚动收集器大小,close状态时收集多少请求状态,用于计算失败率。
          slidingWindowSize: 100
          #状态收集器类型
          #COUNT_BASED:根据数量计算,slidingWindowSize为次数
          #TIME_BASED:根据时间计算,slidingWindowSize为秒数
          slidingWindowType: COUNT_BASED
          #计算错误率的最小请求数,不足最小调用次数不会触发任何变化。
          minimumNumberOfCalls: 10
          #是否自动进入halfOpen状态,默认false-一定时间后进入halfopen,ture-需要通过接口执行。
          automaticTransitionFromOpenToHalfOpenEnabled: false
          #进入halfOpen状态时,可以被调用次数,就算这些请求的失败率,低于设置的失败率变为close状态,否则变为open。
          permittedNumberOfCallsInHalfOpenState: 10
          #open状态变为half状态需要等待的时间,即熔断多久后开始尝试访问被熔断的服务。
          waitDurationInOpenState: 60s
          #事件缓冲区大小??
          eventConsumerBufferSize: 10
          #被计为失败的异常集合,默认情况下所有异常都为失败。
          recordExceptions:
            - java.lang.Exception
          #不会被计为失败的异常集合,优先级高于recordExceptions。
          ignoreExceptions:
            - java.lang.IllegalStateException
      instances: #熔断器类型
        aCustomizer: #使用默认配置
          baseConfig: default
        cacheCustomizer: #自定义配置
          failureRateThreshold: 10
    

    加载自定义配置

    @SpringBootApplication
    public class GatewayApplication {
        public static void main(String[] args){
            SpringApplication.run(GatewayApplication.class, args);
        }
     
        /**
         * 初始化断路器,读取Resilience4J的yaml配置
         * @param circuitBreakerRegistry
         * @return
         */
        @Bean
        public ReactiveResilience4JCircuitBreakerFactory reactiveResilience4JCircuitBreakerFactory(
                CircuitBreakerRegistry circuitBreakerRegistry) {
             ReactiveResilience4JCircuitBreakerFactory factory = new ReactiveResilience4JCircuitBreakerFactory();
     
            //自定义断路器配置
    //        CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom().slidingWindowSize(100).build();
     
            //设置断路器默认配置
            //不修改默认值可以忽略
            factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
                            //默认超时规则,默认1s,不使用断路器超时规则可以设置大一点
                            .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofMillis(60000)).build())
                            //默认断路器规则
    //                        .circuitBreakerConfig(circuitBreakerConfig).build())
            .build());
                          
            //添加自定义拦截器
            factory.configureCircuitBreakerRegistry(circuitBreakerRegistry);
            return factory;
        }
    }
    

    gateway使用断路器

    spring:
      cloud:
        gateway:
          routes:
            - id: r_exception
              uri: lb://EUREKA-PROVIDER
              predicates:
                - Path=/excp/**
              filters:
                - StripPrefix=1
                - name: CircuitBreaker #使用resilience4j断路器
                  args:
                    name: cacheCustomizer  #自定义断路器配置
                    fallbackUri: forward:/cache/timestemp #异常跳转
    

    参考:
    https://blog.csdn.net/Damien_J_Scott/article/details/116700426

    相关文章

      网友评论

        本文标题:Spring Cloud Gateway 使用 Resilien

        本文链接:https://www.haomeiwen.com/subject/qzulldtx.html