SpringCloud学习(3)-resilience4j熔断

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
其余详细配置,其移步官方文档
CircuitBreaker
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以通过在Feign客户端上添加Resilience4j的拦截器来实现熔断逻辑。下面是一些步骤来实现这个过程: 1. 首先,确保你已经添加了Resilience4j的依赖到你的项目中。你可以在Maven或者Gradle配置文件中添加以下依赖: ```xml <dependency> <groupId>io.github.resilience4j</groupId> <artifactId>resilience4j-spring-cloud2</artifactId> <version>1.6.1</version> </dependency> ``` 2. 创建一个实现Feign的RequestInterceptor接口的类,用于拦截Feign的请求。以下是一个示例: ```java import feign.RequestInterceptor; import feign.RequestTemplate; import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @Component public class Resilience4jFeignInterceptor implements RequestInterceptor { private final CircuitBreakerRegistry circuitBreakerRegistry; @Autowired public Resilience4jFeignInterceptor(CircuitBreakerRegistry circuitBreakerRegistry) { this.circuitBreakerRegistry = circuitBreakerRegistry; } @Override public void apply(RequestTemplate requestTemplate) { String serviceName = requestTemplate.feignTarget().name(); circuitBreakerRegistry.circuitBreaker(serviceName).executeRunnable(() -> { // 在这里执行你的Feign请求 requestTemplate.header("Authorization", "Bearer your-token"); }); } } ``` 3. 在你的Feign客户端接口上添加`configuration`属性,使用上述的拦截器类。例如: ```java import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @FeignClient(name = "your-service-name", configuration = Resilience4jFeignInterceptor.class) public interface YourFeignClient { @GetMapping("/your-endpoint") String yourFeignMethod(); } ``` 这样,当你使用`YourFeignClient`接口的方法发送请求时,请求将会通过Resilience4j的断路器进行拦截和熔断处理。 请注意,上面的示例中使用了`CircuitBreakerRegistry`来获取相应的断路器实例。你需要根据你的实际需求进行配置和使用Resilience4j的断路器。另外,你还可以根据需要添加其他的Resilience4j功能,如限流、重试等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值