目录
总系列目录地址
resilience4j 插件配置
soul-bootstrap 确保resilience4j相关依赖已引入。
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-plugin-resilience4j</artifactId>
<version>${project.version}</version>
</dependency>
启动 soul-examples-http
增加 selector 和 rule
rule 必须所有配置都填上,否则会报错,报错提示很不友好,完全不知道配置的哪个点出错。
插件工程soul-plugin-resilience4j
protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
...
// 是否开启熔断
if (resilience4JHandle.getCircuitEnable() == 1) {
return combined(exchange, chain, rule);
}
return rateLimiter(exchange, chain, rule);
}
// 添加 resilience4j 的相关方法
public class CombinedExecutor implements Executor {
@Override
public <T> Mono<T> run(...) {
// 通过配置创建限流器
RateLimiter rateLimiter = ...
// 通过配置创建熔断器
CircuitBreaker circuitBreaker = ...
Mono<T> to = run.transformDeferred(CircuitBreakerOperator.of(circuitBreaker))
.transformDeferred(RateLimiterOperator.of(rateLimiter))
.timeout(resilience4JConf.getTimeLimiterConfig().getTimeoutDuration())
.doOnError(TimeoutException.class, t -> circuitBreaker.onError(
resilience4JConf.getTimeLimiterConfig().getTimeoutDuration().toMillis(),
TimeUnit.MILLISECONDS,
t));
...
return to;
}
}
熔断使用接口 CircuitBreakerRegistry ,限流使用接口 RateLimiterRegistry。
了解一下 resilience4j
resilience4j 是轻量级熔断框架,来源于 Netflix Hystrix,没有很多依赖包,只使用了Vavr。
resilience4j 主要机制是状态机+环形缓存区,缓存区的数据使用bit来存储,非常节省空间。
通过环形缓存区,记录每次成功和失败次数,当访问次数填满环形缓存后开始计算失误率,熔断器状态修改为open/close。
熔断状态分为开启,关闭和半开放。开放状态全部拦截,关闭状态全部允许通过,半开放状态允许部分通过。
关于 Vavr
resilience4j 基于 Vavr, Vavr 简单地讲,就是函数式编程的一个库, 类似 Stream, 功能比 java stream 丰富,而且更简洁。
总结
soul 的 resilience4j 熔断器框架,通过 Resilience4JPlugin 注入到调用链中, 通过 Mono.transformDeferred 插入熔断器和限流器。
Resilience4j 是轻量级熔断框架,底层使用 Varv, 代码很少,以状态机的状态启停熔断器。