4.2 Resilience4j简介
4.2.1 Resilience4j简介
Netflix的Hystrix微服务容错库已经停⽌更新,官⽅推荐使⽤Resilience4j代替Hystrix,或者使⽤Spring Cloud Alibaba的Sentinel组件。
Resilience4j是受到Netflix Hystrix的启发,为Java8和函数式编程所设计的轻量级容错框架。整个框架只是使⽤了Varr的库,不需要引⼊其他的外部依赖。与此相⽐,Netflix Hystrix对Archaius具有编译依赖,⽽Archaius需要更多的外部依赖,例如Guava和Apache Commons Configuration。
Resilience4j提供了提供了⼀组⾼阶函数(装饰器),包括断路器,限流器,重试机制,隔离机制。你可以使⽤其中的⼀个或多个装饰器对函数式接⼝,lambda表达式或⽅法引⽤进⾏装饰。这么做的优点是你可以选择所需要的装饰器进⾏装饰。
在使⽤Resilience4j的过程中,不需要引⼊所有的依赖,只引⼊需要的依赖即可。
核⼼模块:
resilience4j-circuitbreaker: 熔断
resilience4j-ratelimiter: 限流
resilience4j-bulkhead: 隔离
resilience4j-retry: ⾃动重试
resilience4j-cache: 结果缓存
resilience4j-timelimiter: 超时处理
4.2.2 Resilience4j和Hystrix的异同
Hystrix使⽤HystrixCommand来调⽤外部的系统,⽽R4j提供了⼀些⾼阶函数,例如断路器、限流器、隔离机制等,这些函数作为装饰器对函数式接⼝、lambda表达式、函数引⽤进⾏装饰。此外,R4j库还提供了失败重试和缓存调⽤结果的装饰器。你可以在函数式接⼝、
lambda表达式、函数引⽤上叠加地使⽤⼀个或多个装饰器,这意味着隔离机制、限流器、重试机制等能够进⾏组合使⽤。这么做的优点在于,你可以根据需要选择特定的装饰器。任何被装饰的⽅法都可以同步或异步执⾏,异步执⾏可以采⽤ CompletableFuture 或RxJava。
当有很多超过规定响应时间的请求时,在远程系统没有响应和引发异常之前,断路器将会开启。
当Hystrix处于半开状态时,Hystrix根据只执⾏⼀次请求的结果来决定是否关闭断路器。⽽R4j允许执⾏可配置次数的请求,将请求的结果和配置的阈值进⾏⽐较来决定是否关闭断路器。
R4j提供了⾃定义的Reactor和Rx Java操作符对断路器、隔离机制、限流器中任何的反应式类型进⾏装饰。
Hystrix和R4j都发出⼀个事件流,系统可以对发出的事件进⾏监听,得到相关的执⾏结果和延迟的时间统计数据都是⼗分有⽤的。
4.3 Resilence4j最佳实践
下⾯分三⽅⾯讲解Resilence4j对于微服务容错的处理,分别为熔断,隔离,限流。
4.3.1 断路器(CircuitBreaker)
4.3.1.1.CircuitBreaker简介
断路器通过有限状态机实现,有三个普通状态:关闭(CLOSED)、开启(OPEN)、半开 (HALF_OPEN),还有两个特殊状态:禁⽤(DISABLED)、强制开启(FORCED_OPEN)。
当熔断器关闭时,所有的请求都会通过熔断器。如果失败率超过设定的阈值,熔断器就会从关闭状态转换到打开状态,这时所有的请求都会被拒绝。当经过⼀段时间后,熔断器会从打开状态转换到半开状态,这时仅有⼀定数量的请求会被放⼊,并重新计算失败率,如果失败率超过阈值,则变为打开状态,如果失败率低于阈值,则变为关闭状态。
断路器使⽤滑动窗⼝来存储和统计调⽤的结果。你可以选择基于调⽤数量的滑动窗⼝或者基于时间的滑动窗⼝。基于访问数量的滑动窗⼝统计了最近N次调⽤的返回结果。居于时间的滑动窗⼝统计了最近N秒的调⽤返回结果。
除此以外,熔断器还会有两种特殊状态:DISABLED(始终允许访问)和FORCED_OPEN(始终拒绝访问)。这两个状态不会⽣成熔断器事件(除状态装换外),并且不会记录事件的成功或者失败。退出这两个状态的唯⼀⽅法是触发状态转换或者重置熔断器。
4.3.1.2.添加依赖
org.springframework.cloud spring-cloud-starter-circuitbreaker-resilience4j4.3.1.3.CircuitBreaker配置
| 配置属性 | 默认值 | 描述 |
| failureRateThreshold | 50 | 以百分⽐配置失败率阈值。当失败率等于或⼤于阈值时,断路器状态并关闭变为开启,并进⾏服务降级。 |
| slowCallRateThreshold | 100 | 以百分⽐的⽅式配置,断路器把调⽤时间⼤于slowCallDurationThreshold的调⽤视为慢调⽤,当慢调⽤⽐例⼤于等于阈值时,断路器开启,并进⾏服务降级。 |
| slowCallDurationThreshold | 60000[ms] | 配置调⽤时间的阈值,⾼于该阈值的呼叫视为慢调⽤,并增加慢调⽤⽐例。 |
| permittedNumberOfCallsInHalfOpenState | 10 | 断路器在半开状态下允许通过的调⽤次数。 |
| maxWaitDurationInHalfOpenState | 0 | 断路器在半开状态下的最⻓等待时间,超过该配置值的话,断路器会从半开状态恢复为开启状态。配置是0时表示断路器会⼀直处于半开状态,直到所有允许通过的访问结束。 |
| slidingWindowType |

本文介绍了Resilience4j,一个轻量级的Java容错框架,用于微服务中的断路器、限流、重试和隔离。它与Hystrix相比,提供更灵活的装饰器方式和自定义选项。通过SpringCloud集成,展示了如何在项目中应用Resilience4j进行服务降级和错误处理。
最低0.47元/天 解锁文章
3221

被折叠的 条评论
为什么被折叠?



