断路器:Resilience4j配置及应用(gateway应用)

环境配置

引入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 #异常跳转

注意:断路器默认内置1s超时异常,resilicene4j超时问题分析

PS:基本配置,后期再完善。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
基于断路器的熔断限流是一种比较常用的解决方案,它通过设置断路器的开关状态来控制请求的访问。当系统出现异常时,断路器打开,直接返回错误响应,避免请求继续向下传递,从而保护系统稳定性。 在Gateway中,可以通过使用Spring Cloud Circuit Breaker来实现断路器的功能。具体实现步骤如下: 1. 引入Spring Cloud Circuit Breaker依赖: ```xml <!-- Spring Cloud Circuit Breaker --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId> </dependency> ``` 2. 在配置文件中开启Circuit Breaker功能: ```yaml spring: cloud: gateway: routes: - id: route1 uri: http://localhost:8081 predicates: - Path=/api/** filters: - name: CircuitBreaker args: name: myCircuitBreaker fallbackUri: forward:/fallback ``` 在这里,我们为路由`route1`添加了一个名为`CircuitBreaker`的过滤器,设置了断路器的名称为`myCircuitBreaker`,同时指定了fallback的URI。 3. 编写fallback逻辑: ```java @Component public class MyFallbackProvider implements FallbackProvider { @Override public String getRoute() { return "route1"; } @Override public ClientHttpResponse fallbackResponse(String route, Throwable cause) { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() throws IOException { return HttpStatus.SERVICE_UNAVAILABLE; } @Override public int getRawStatusCode() throws IOException { return HttpStatus.SERVICE_UNAVAILABLE.value(); } @Override public String getStatusText() throws IOException { return HttpStatus.SERVICE_UNAVAILABLE.getReasonPhrase(); } @Override public void close() { } @Override public InputStream getBody() throws IOException { return new ByteArrayInputStream("fallback".getBytes()); } @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); return headers; } }; } } ``` 在这里,我们定义了一个名为`MyFallbackProvider`的FallbackProvider,实现了`getRoute()`和`fallbackResponse()`方法,其中`getRoute()`方法返回所属的路由id,`fallbackResponse()`方法返回一个`ClientHttpResponse`对象,用于表示fallback的响应结果。 通过以上步骤,我们就可以实现基于断路器的熔断限流功能。当路由出现异常时,断路器会打开,请求会被转发到fallback URI。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lizz666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值