diff --git a/fizz-bootstrap/pom.xml b/fizz-bootstrap/pom.xml index d9de446..3d80999 100644 --- a/fizz-bootstrap/pom.xml +++ b/fizz-bootstrap/pom.xml @@ -63,11 +63,11 @@ ${project.version} --> - + org.springframework.cloud spring-cloud-context diff --git a/fizz-core/pom.xml b/fizz-core/pom.xml index 39c12d5..4544227 100644 --- a/fizz-core/pom.xml +++ b/fizz-core/pom.xml @@ -155,6 +155,11 @@ spring-cloud-starter-alibaba-nacos-discovery + + org.springframework.cloud + spring-cloud-starter-circuitbreaker-reactor-resilience4j + + org.springframework.boot spring-boot-configuration-processor diff --git a/fizz-core/src/main/java/we/config/FizzWebClientConfig.java b/fizz-core/src/main/java/we/config/FizzWebClientConfig.java new file mode 100644 index 0000000..a4cf612 --- /dev/null +++ b/fizz-core/src/main/java/we/config/FizzWebClientConfig.java @@ -0,0 +1,75 @@ +package we.config; + +import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig; +import io.github.resilience4j.timelimiter.TimeLimiterConfig; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.cloud.circuitbreaker.resilience4j.ReactiveResilience4JCircuitBreakerFactory; +import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigBuilder; +import org.springframework.cloud.client.circuitbreaker.Customizer; +import org.springframework.cloud.client.loadbalancer.reactive.ReactorLoadBalancerExchangeFilterFunction; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; +import we.Fizz; + +import javax.annotation.Resource; +import java.time.Duration; + +//@Configuration +public class FizzWebClientConfig { + + /*public static final String FIZZ_LOAD_BALANCED_WEB_CLIENT = "fizzLoadBalancedWebClient"; + + @Bean(FIZZ_LOAD_BALANCED_WEB_CLIENT) + public WebClient LoadBalancedWebClient(@Qualifier(ProxyWebClientConfig.proxyWebClient) WebClient sourceWebClient, + ReactorLoadBalancerExchangeFilterFunction reactorLoadBalancerExchangeFilterFunction) { + + return sourceWebClient.mutate().filter(reactorLoadBalancerExchangeFilterFunction).build(); + }*/ + + // disable the Resilience4J auto-configuration spring.cloud.circuitbreaker.resilience4j.enabled = false + + /*@Bean + public Customizer defaultCustomizer() { + return factory -> factory.configureDefault( + id -> new Resilience4JConfigBuilder(id) + .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults()) + .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(4)).build()) + .build() + ); + }*/ + + /*@Bean + public Customizer slowCustomizer() { + return factory -> { + factory.configure( + builder -> builder + .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults()) + .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(2)).build()), + "slow", "slowflux" + ); + factory.addCircuitBreakerCustomizer( + Customizer.once( + circuitBreaker -> circuitBreaker.getEventPublisher() + .onError(null) // normalFluxErrorConsumer + .onSuccess(null), // normalFluxSuccessConsumer + circuitBreaker -> circuitBreaker.getName() + ), + "normalflux" + ); + }; + }*/ + + /*@Resource + private ReactiveResilience4JCircuitBreakerFactory reactiveResilience4JCircuitBreakerFactory; + + public void x() { + WebClient webClient = (WebClient) Fizz.context.getBean(ProxyWebClientConfig.proxyWebClient); + webClient.get().uri("/slow").retrieve().bodyToMono(String.class) + .transform( + stringMono -> reactiveResilience4JCircuitBreakerFactory.create("slow") + .run(stringMono, throwable -> Mono.just("fallback")) + ); + }*/ +} diff --git a/pom.xml b/pom.xml index 3a117f5..5550fb3 100644 --- a/pom.xml +++ b/pom.xml @@ -236,6 +236,12 @@ + + org.springframework.cloud + spring-cloud-starter-circuitbreaker-reactor-resilience4j + 1.0.6.RELEASE + + org.springframework.cloud spring-cloud-context