环境配置
引入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:基本配置,后期再完善。