框架

Spring Cloud Gateway 使用 Resilien

2023-02-28  本文已影响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>

状态项

三个一般性状态

两个特定状态

状态转换

使用

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

上一篇下一篇

猜你喜欢

热点阅读