查询办法

打开SpringCloud官网,在页面中找到Release train Spring Boot compatibility这部分:

查看Spring Boot和Spring Cloud版本对应关系

注意

从2020.0.x版本开始,Spring Cloud官方已经将Hystrix移除,需要使用 Resilience4j 替代 Hystrix 进行熔断

替换方法

1.添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot2</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

2.配置 application.yml

resilience4j:
  circuitbreaker:
    instances:
      myFeignClient:
        sliding-window-size: 10  # 统计窗口大小
        minimum-number-of-calls: 5  # 最小请求数,达到后才计算失败率
        failure-rate-threshold: 50  # 失败率达到 50% 触发熔断
        wait-duration-in-open-state: 5000ms  # 熔断器打开后等待时间
        permitted-number-of-calls-in-half-open-state: 3  # 半开状态允许 3 次请求

3.修改FeignClient 接口

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(name = "my-service", url = "http://localhost:8081")
public interface MyFeignClient {

    @GetMapping("/test")
    @CircuitBreaker(name = "myFeignClient", fallbackMethod = "fallbackMethod")
    String callRemoteService(@RequestParam String param);

    // 熔断后执行的方法
    default String fallbackMethod(String param, Throwable t) {
        return "远程服务不可用:" + param;
    }
}

4.配置说明

  1. 正常情况下,invoke 方法通过 Feign 调用远程接口 /test。
  2. 如果远程服务返回错误或超时,Resilience4j 会熔断并执行 fallbackMethod 方法返回 "远程服务不可用"。
  3. 熔断器的 失败率达到 50% 后,会进入 打开(Open)状态,自动拒绝请求,并等待 5 秒后 进入半开状态。
  4. 半开(Half-Open)状态 下允许 3 个请求,如果它们成功,熔断器恢复 关闭(Closed)状态。