舱壁隔离
作用是限制并发。依赖隔离&负载保护:用于限制对于下游服务的最大并发数量的限制
Resilience4j提供两种隔离机制:
-
信号量舱壁SemaphhoreBulkhead
-
固定线程池舱壁FixedThreadPoolBulkhead
maven依赖
<dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-bulkhead</artifactId> </dependency>
信号量舱壁配置
#信号量 resilience4j: timelimiter: configs: default: timeout-duration: 10s # 默认1s 超过1s直接降级 (坑) bulkhead: # 信号量舱壁 configs: default: max-concurrent-calls: 2 max-wait-duration: 1s instances: cloud-payment-service: base-config: default
线程池舱壁
# 线程池 resilience4j: timelimiter: configs: default: timeout-duration: 10s # 默认1s 超过1s直接降级 (坑) thread-pool-bulkhead: configs: default: max-thread-pool-size: 1 core-thread-pool-size: 1 queue-capacity: 1 instances: cloud-payment-service: base-config: default #spring.cloud.openfeign.circuitbreaker.group.enabled:设置为false 和原来的主线程脱离
限流
resilience4j: ratelimiter: configs: default: limit-for-period: 2 # 一次刷新周期内允许最大的请求数 limit-refresh-period: 1s # 刷新周期 timeout-duration: 1 # 默认等待时间 instances: cloud-payment-service: base-config: default
限流算法:
-
漏斗算法:缺点是对突发性流量缺乏效率
-
令牌桶算法:springcloud默认算法
-
滚动事件窗:缺点是临界点容易流量过大崩溃
-
滑动事件窗口:可以理解在滚动上添加一个偏移量