Resilience4j简介-circuitbreaker 异常熔断实践介绍

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

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-resilience4j
4.3.1.3.CircuitBreaker配置
配置属性 默认值 描述
failureRateThreshold 50 以百分⽐配置失败率阈值。当失败率等于或⼤于阈值时,断路器状态并关闭变为开启,并进⾏服务降级。
slowCallRateThreshold 100 以百分⽐的⽅式配置,断路器把调⽤时间⼤于slowCallDurationThreshold的调⽤视为慢调⽤,当慢调⽤⽐例⼤于等于阈值时,断路器开启,并进⾏服务降级。
slowCallDurationThreshold 60000[ms] 配置调⽤时间的阈值,⾼于该阈值的呼叫视为慢调⽤,并增加慢调⽤⽐例。
permittedNumberOfCallsInHalfOpenState 10 断路器在半开状态下允许通过的调⽤次数。
maxWaitDurationInHalfOpenState 0 断路器在半开状态下的最⻓等待时间,超过该配置值的话,断路器会从半开状态恢复为开启状态。配置是0时表示断路器会⼀直处于半开状态,直到所有允许通过的访问结束。
slidingWindowType
### 在 Spring Cloud Gateway 3.17 版本中集成 Resilience4j 实现熔断功能 为了在 `spring-cloud-starter-gateway` 3.17 版本中使用 `spring-cloud-starter-circuitbreaker-reactor-resilience4j` 实现熔断功能,需要遵循以下设计原则和技术细节: #### 技术背景 Spring Cloud Gateway 是一种用于构建 API 网关的服务框架,它支持动态路由、限流等功能。Resilience4j 则是一个轻量级库,专注于容错能力的实现,如断路器、重试等[^1]。两者的结合能够显著提升网关层的稳定性和可靠性。 --- ### 配置与实现 #### 添加依赖项 首先,在项目的 `pom.xml` 文件中引入必要的依赖项: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> <version>3.1.7</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId> </dependency> ``` 注意:确保使用的版本兼容性。对于 Spring Cloud Gateway 3.17,推荐搭配最新版的 Resilience4j 库。 --- #### 配置文件调整 编辑 `application.yml` 或 `application.properties` 文件,配置 Resilience4j 的断路器参数: ```yaml spring: cloud: gateway: routes: - id: sample_route_with_circuit_breaker uri: http://example.com/api predicates: - Path=/sample/** filters: - name: CircuitBreaker args: name: backendA fallbackUri: forward:/fallback/sample resilience4j: circuitbreaker: configs: default: registerHealthIndicator: true slidingWindowSize: 10 minimumNumberOfCalls: 5 failureRateThreshold: 50 waitDurationInOpenState: 10s permittedNumberOfCallsInHalfOpenState: 3 instances: backendA: baseConfig: default ``` 在此配置中: - 定义了一个名为 `backendA` 的断路器实例。 - 设置了滑动窗口大小 (`slidingWindowSize`) 和允许的最大失败率 (`failureRateThreshold`)。 - 指定了回退 URI (`fallbackUri`),以便在网络请求失败时返回备用响应。 --- #### 创建回退控制器 定义一个回退控制器来处理断路器触发后的逻辑: ```java @RestController @RequestMapping("/fallback") public class FallbackController { @GetMapping("/sample") public ResponseEntity<String> handleSampleFallback() { return ResponseEntity.ok("Fallback response from /sample route"); } } ``` 此控制器会在主服务不可用时提供替代响应。 --- #### 测试熔断功能 启动应用程序后,可以通过模拟网络异常测试熔断行为。例如,发送多个连续失败请求以验证断路器是否会切换到打开状态,并观察是否成功跳转到指定的回退路径。 --- ### 关键技术点解析 1. **断路器的工作原理** 断路器的核心在于检测目标服务的成功率和错误率。如果错误率达到预设阈值,则会暂时阻止后续请求进入该服务,直到经过一段冷却期后再尝试恢复连接[^1]。 2. **Reactor 与 Resilience4j 的集成** Reactor 是 Spring WebFlux 的核心组件之一,而 Resilience4j 提供了对其的良好支持。两者共同作用下,能够在异步非阻塞环境下高效执行熔断逻辑[^4]。 3. **动态更新配置** 结合 Spring Cloud Config 使用时,可以进一步增强灵活性,使断路器参数具备动态可调能力[^1]。 --- ### 示例代码总结 完整的项目结构应包含以下几个部分: 1. Maven/Gradle 构建工具中的依赖声明; 2. YAML 格式的全局配置; 3. 回退逻辑对应的 REST 控制器; 4. 单元测试脚本来验证预期行为。 通过以上步骤,即可顺利实现在 Spring Cloud Gateway 中利用 Resilience4j 执行熔断的功能。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值