当前位置: 代码迷 >> 综合 >> Resilience4j:断路器Resilience4j配置及应用(gateway应用)
  详细解决方案

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

热度:51   发布时间:2024-01-29 12:36: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:半开,OPEN状态一定时间后,变为半开状态,

两个特定状态

  • DISABLED:禁用
  • FORCED_OPEN:强开

状态转换

CLOSED 》 OPEN 》HALF_OPEN

配置项

配置属性 默认值 描述
failureRateThreshold 50 以百分率形式配置失败率阈值。失败率大于等于阈值时,CircuitBreaker转变为打开状态,并使调用短路。
slowCallRateThreshold 100 以百分率形式配置慢调用率阈值。当调用执行的时长大于slowCallDurationThreshold时,CircuitBreaker会认为调用为慢调用。当慢调用占比大于等于此阈值时,CircuitBreaker转变为打开状态,并使调用短路。
slowCallDurationThreshold 60000 [ms] 配置调用执行的时长阈值。当超过这个阈值时,调用会被认为是慢调用,并增加慢调用率。
permittedNumberOfCallsInHalfOpenState 10 当CircuitBreaker是半开状态时,配置被允许的调用次数。
slidingWindowType

COUNT_BASED

/TIME_BASED

配置滑动窗口类型。当CircuitBreaker关闭时,这种类型的滑动窗口会记录调用结果。滑动窗口要么是基于计数的,要么是基于时间的。若滑动窗口为COUNT_BASED,则最近slidingWindowSize次的调用会被记录和统计。若滑动窗口为TIME_BASED,则最近slidingWindowSize秒中的调用会被记录和统计。
slidingWindowSize 100 配置滑动窗口的大小。当CircuitBreaker关闭后用于记录调用结果。
minimumNumberOfCalls 10 配置最小调用次数。在CircuitBreaker计算错误率前,要求(在每滑动窗口周期)用到这个值。例如,若minimumNumberOfCalls是10,为计算失败率,则最小要记录10个调用。若只记录了9个调用,即使9个都失败,CircuitBreaker也不会打开。
waitDurationInOpenState 60000 [ms] CircuitBreaker状态从打开转化为半开时,需要等待的时长。
automaticTransitionFromOpenToHalfOpenEnabled false 如果为true,则CircuitBreaker会自动从打开状态转化为半开状态。不需要另外的调用来触发这种转换。
recordExceptions empty 这个异常列表用来存放被当作失败的异常,这些异常发生时会增加失败率。任何异常,只要不是在ignoreExceptions中被明确忽略的,如果匹配或继承自异常列表中的异常,都会当作失败。若设置了异常列表,不在异常列表中的异常,只要不在ignoreExceptions中存在,都会当作成功。
ignoreExceptions empty 这个异常列表用来存放可忽略的异常,这些异常即不当作成功也不当作失败。任何异常,只要匹配或继承自此异常列表中的异常,都不会当作成功或失败,即使recordExceptions中存在这个异常。
recordException

throwable -> true

所有异常默认都当作失败。

这是一个定制的Predicate,会评估是否把异常当作失败。除非异常在ignoreExceptions中存在,不然,只有Predicate必须返回true时,才把异常当作失败;只有Predicate必须返回false时,才把异常当作成功。
ignoreException

throwable -> false

所有异常默认都不会被忽略。

这是一个定制的Predicate,会评估异常是否应该被忽略,而不是把它当作失败或成功。如果应忽略此异常,则Predicate必须返回true。如果把异常当作失败,则Predicate必须返回false。
eventConsumerBufferSize 10 事件缓冲区大小

使用

yml配置

resilience4j.circuitbreaker:configs: #通用配置default:slidingWindowSize: 10minimumNumberOfCalls: 5permittedNumberOfCallsInHalfOpenState: 3automaticTransitionFromOpenToHalfOpenEnabled: truewaitDurationInOpenState: 2sfailureRateThreshold: 50eventConsumerBufferSize: 10recordExceptions:- org.springframework.web.client.HttpServerErrorException- java.io.IOExceptionignoreExceptions:- java.lang.IllegalStateExceptionshared:slidingWindowSize: 100instances:backendA: #断路器名称baseConfig: default  #引入通用配置cacheCustomizer: #断路器名称failureRateThreshold: 10  # 错误比率eventConsumerBufferSize: 10 # 事件缓冲区

 

gateway使用断路器

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

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