添加依赖
<dependency><groupId>io.github.resilience4j</groupId><artifactId>resilience4j-spring-boot2</artifactId><version>1.7.0</version>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId>
</dependency>
这里有个坑,AOP依赖是必须的,因为Resilience4j 是依赖于 AOP 来拦截方法调用的。
application.properties
resilience4j.circuitbreaker.instances.myCircuitBreaker.register-health-indicator=true
# 失败率阈值(50%)
resilience4j.circuitbreaker.instances.myCircuitBreaker.failure-rate-threshold=50
# 最小调用次数
resilience4j.circuitbreaker.instances.myCircuitBreaker.minimum-number-of-calls=5
# 滑动窗口大小
resilience4j.circuitbreaker.instances.myCircuitBreaker.sliding-window-size=10
# 熔断后等待时间
resilience4j.circuitbreaker.instances.myCircuitBreaker.wait-duration-in-open-state=10s
#滑动窗口类型(基于次数)
resilience4j.circuitbreaker.instances.myCircuitBreaker.sliding-window-type=COUNT_BASED
Controller
import com.example.testdemo.service.MyService;
import io.github.resilience4j.ratelimiter.annotation.RateLimiter;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequiredArgsConstructor
public class MyController {private final MyService myService;@GetMapping("/testCircuitBreaker")public String testCircuitBreaker() {// 模拟业务逻辑return myService.testCircuitBreaker();}}
Service
import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry;
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;/*** @author user*/
@Service
public class MyService {@Autowiredprivate CircuitBreakerRegistry circuitBreakerRegistry;private int counter = 0;@CircuitBreaker(name = "myCircuitBreaker", fallbackMethod = "fallback") // 熔断public String testCircuitBreaker() {io.github.resilience4j.circuitbreaker.CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker("myCircuitBreaker");System.out.println("Circuit Breaker State: " + circuitBreaker.getState()); // 打印熔断器状态counter++;System.out.println(counter);if (counter % 2 == 0) { // 模拟50%的失败率throw new RuntimeException("Service call failed!");}if (counter > 3 && counter < 10) {throw new RuntimeException("Service call failed!");}return "Service call succeeded!";}// 熔断降级方法public String fallback(Exception ex) {return "Service is unavailable, please try again later.";}}