Resilience4j 是一个轻量级容错框架,设计灵感来源于Netflix 的Hystrix框架,为函数式编程所设计。
Resilience4j 提供了一组装饰器(Decorator),包括舱壁(Bulkhead)、断路器(CircuitBreaker)、限速器(RateLimiter)、重试(Retry),可以根据需要选择特定的装饰器进行组合,对任何的函数式接口,lambda表达式,或方法的引用进行增强,并且这些装饰器可以进行叠加。
在 Soul 网关中 Resilience4j 插件集成了 CircuitBreaker、 RateLimiter 和 TimeLimiter
CircuitBreaker 通过具有三种正常状态的有限状态机实现:CLOSED,OPEN和HALF_OPEN以及两个特殊状态DISABLED和FORCED_OPEN。CLOSE状态时,所有的请求都会通过CircuitBreaker。如果失败率超过设定的阈值,CircuitBreaker 就会从 CLOSED 转换到 OPEN,这时所有的请求都会被拒绝。当经过一段时间后,熔断器会从 OPEN 转换到 HALF_OPEN,这时仅有一定数量的请求会被放入,CircuitBreaker 会重新计算失败率,如果失败率超过阈值,则变为 OPEN,如果失败率低于阈值,则变为 CLOSED。
Resilience4j记录请求状态的数据结构和Hystrix不同,Hystrix 使用sliding window,而 Resilience4j 使用 Ring Bit Buffer(环形缓冲区)。
限速器(RateLimiter)的功能是防止突然的过量请求(如 DDOS 攻击或恶意网络爬虫)导致后端服务承受过量压力,RateLimiter 有一个刷新周期的概念,限定在一个固定刷新周期内可处理的最大请求数量。若在某一个刷新周期内的请求数量已经达到最大,则本周期内接下来的所有请求都将进入 BLOCKING 状态,如果在最大阻塞计时内新的刷新周期开启,则阻塞状态的请求将进入新的周期内进行处理。如最大的阻塞计时内新的刷新周期并未开启,则此时超出阻塞计时的那些请求将被直接拒绝。