我想在一个Spring boot应用程序中实现CircuitBreaker模式.我有两个API,每个API都有自己的配置.我在应用程序类中定义了这两种配置方法. 此外,在应用程序类中,我定义了一个CustomCircuitBreakerFactory类型的Spring Bean.此类型是一个自定义类,将创建用于管理和配置API的断路器.这个spring bean在其构造函数中接受三个参数:
import io.github.resilience4j.circuitbreaker.CallNotPermittedException;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.circuitbreaker.resilience4j.ReactiveResilience4JCircuitBreakerFactory;
import org.springframework.context.annotation.Bean;
import java.time.Duration;
import java.util.List;
@SpringBootApplication(scanBasePackages = {"com.company.*"})
public class ApiApplication {
public static void main(String[] args) {
SpringApplication.run(ApiApplication.class, args);
}
@Bean
@Qualifier("api1CircuitBreakerConfig")
public CircuitBreakerConfig api1CircuitBreakerConfig() {
return CircuitBreakerConfig.custom()
.failureRateThreshold(50)
.waitDurationInOpenState(Duration.ofSeconds(10))
.permittedNumberOfCallsInHalfOpenState(10)
.slidingWindowSize(100)
.minimumNumberOfCalls(20)
.recordExceptions(RuntimeException.class, CallNotPermittedException.class)
.build();
}
@Bean
@Qualifier("api2CircuitBreakerConfig")
public CircuitBreakerConfig api2CircuitBreakerConfig() {
return CircuitBreakerConfig.custom()
.failureRateThreshold(40)
.waitDurationInOpenState(Duration.ofSeconds(10))
.permittedNumberOfCallsInHalfOpenState(10)
.slidingWindowSize(150)
.minimumNumberOfCalls(30)
.recordExceptions(RuntimeException.class, CallNotPermittedException.class)
.build();
}
@Bean
public CustomCircuitBreakerFactory customCircuitBreakerFactory(
ReactiveResilience4JCircuitBreakerFactory circuitBreakerFactory,
CircuitBreakerConfig api1CircuitBreakerConfig,
CircuitBreakerConfig api2CircuitBreakerConfig) {
return new CustomCircuitBreakerFactory(circuitBreakerFactory, api1CircuitBreakerConfig, api2CircuitBreakerConfig);
}
}
它是CustomCircuitBreakerFactory的实现.它是用于配置和管理断路器的组件类.它的构造函数中有三个参数,有两种方法 for each 底层API创建和配置断路器实例.
import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.cloud.circuitbreaker.resilience4j.ReactiveResilience4JCircuitBreakerFactory;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class CustomCircuitBreakerFactory {
private final ReactiveResilience4JCircuitBreakerFactory circuitBreakerFactory;
private final CircuitBreakerConfig api1CircuitBreakerConfig;
private final CircuitBreakerConfig api2CircuitBreakerConfig;
public CustomCircuitBreakerFactory(
ReactiveResilience4JCircuitBreakerFactory circuitBreakerFactory,
@Qualifier("api1CircuitBreakerConfig") CircuitBreakerConfig api1CircuitBreakerConfig,
@Qualifier("api2CircuitBreakerConfig") CircuitBreakerConfig api2CircuitBreakerConfig) {
this.circuitBreakerFactory = circuitBreakerFactory;
this.api1CircuitBreakerConfig= api1CircuitBreakerConfig;
this.api2CircuitBreakerConfig= api2CircuitBreakerConfig;
}
public CircuitBreaker createApi1CircuitBreaker() {
return (CircuitBreaker) circuitBreakerFactory.create("api1");
}
public CircuitBreaker createApi2CircuitBreaker() {
return (CircuitBreaker) circuitBreakerFactory.create("api2");
}
}
当我运行应用程序时,我得到了这个错误:ApiApplication中的方法customCircuitBreakerFactory的参数1需要一个bean,但找到了2个: - api 1CircuitBreakerconfig:由ApiFacadeApplication中的方法'api 1CircuitBreakerconfig'定义 - api 2CircuitBreakerconfig:由ApiFacadeApplication中的方法'api 2CircuitBreakerconfig'定义 我用了@ fixier,但它不工作.
我用了@ fixier,但它不工作.