目录

高并发之熔断器,springboot整合Resilience4j实现熔断器

目录

高并发之熔断器,springboot整合Resilience4j实现熔断器

添加依赖

<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 {

    @Autowired
    private 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.";
    }

}