高并发之熔断器,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.";
}
}