环境配置
引入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
网友评论