1.resilience4j简介
resilience4j是提供服务熔断,降级,限流,重试等能力的微服务组件。是circuitBreaker(断路器)的一种具体实现。
限流、降级和资源隔离是分布式系统设计中常用的三种技术手段,它们主要目的是增强系统的稳定性和可用性,尤其在高并发和不稳定网络环境下显得尤为重要。
熔断和降级个人理解:
熔断指的是满足熔断机制时(失败率,慢调用率),所有请求直接返回托底方法。
降级可以理解为熔断后的一种策略,即返回托底方法。但降级不只在熔断时才会触发,有四种情况都会触发:1、方法抛出异常 2、方法调用超时 3、熔断器开启拦截调用 4、线程池、队列、信号量已满。
2.circuitBreaker断路器
断路器:在微服务技术中扮演则重要的角色,其主要作用是检测服务的异常次数,在达到阈值后会打开断路器,进行服务降级。避免拖垮整个服务。再后续一段时间后,又会放出一部分流量,看调用是否正常再决定关闭断路器。
一般情况下断路器有三种状态:CLOSE(关闭,不允许访问)、OPEN、HALF_OPEN;
特殊情况下还会有两种状态:DISABLED(始终允许访问)、FORCED_OPEN(始终拒绝访问);
特殊状态退出方法重启断路器。
断路器有两种统计调用结果的方式
-
基于调用数量:最近N次
-
基于调用时间:最近N秒
3.resilience4j熔断使用
3.1maven依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId> </dependency>
3.2配置文件(基于时间和数量)
# 基于慢调用的降级
resilience4j:
timelimiter:
configs:
default:
timeout-duration: 10s # 默认1s 超过1s直接降级 (坑)
circuitbreaker:
configs:
default:
failure-rate-threshold: 50 # 调用失败达到50%后打开断路器
slow-call-duration-threshold: 2s # 慢调用时间阈值
slow-call-rate-threshold: 30 # 慢调用百分比峰值
sliding-window-type: time_based # 滑动窗口类型
sliding-window-size: 2 # 滑动窗口大小 count_based6个请求 time_base6秒
minimum-number-of-calls: 2 # 每个滑动窗口的周期
automatic-transition-from-open-to-half-open-enabled: true # 开始过度到半开状态
wait-duration-in-open-state: 5s # 从开启到半开启需要5s
permitted-number-of-calls-in-half-open-state: 2 #半开状态允许通过的最大请求数
record-exceptions:
- java.lang.Exception
instances:
cloud-payment-service:
base-config: default
# 基于次数的降级
resilience4j:
timelimiter:
configs:
default:
timeout-duration: 10s # 默认1s 超过1s直接降级 (坑)
circuitbreaker: # 降级熔断
configs:
default:
failure-rate-threshold: 50 # 调用失败达到50%后打开断路器
sliding-window-type: count_based # 滑动窗口类型
sliding-window-size: 6 # 滑动窗口大小 count_based6个请求 time_base6秒
minimum-number-of-calls: 6 # 每个滑动窗口的周期
automatic-transition-from-open-to-half-open-enabled: true # 开始过度到半开状态
wait-duration-in-open-state: 5s # 从开启到半开启需要5s
permitted-number-of-calls-in-half-open-state: 2 #半开状态允许通过的最大请求数
record-exceptions:
- java.lang.Exception
instances:
cloud-payment-service:
base-config: default
bulkhead: # 信号量舱壁
configs:
default:
max-concurrent-calls: 2
max-wait-duration: 1s
instances:
cloud-payment-service:
base-config: default