Here's an MRE. Я потратил некоторое время, написал его с нуля и постарался сделать его небольшим
Код: Выделить всё
package com.example.gatewaydemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class GatewaydemoApplication {
public static void main(String[] args) {
SpringApplication.run(GatewaydemoApplication.class, args);
}
}
Код: Выделить всё
package com.example.gatewaydemo.config;
import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
import io.github.resilience4j.timelimiter.TimeLimiterConfig;
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.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.OrderedGatewayFilter;
import org.springframework.cloud.gateway.filter.factory.SpringCloudCircuitBreakerFilterFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpStatus;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.RouterFunctions;
import org.springframework.web.reactive.function.server.ServerResponse;
@Configuration
public class MyCircuitBreakerConfig {
private final ServerProperties serverProperties;
public MyCircuitBreakerConfig(ServerProperties serverProperties) {
this.serverProperties = serverProperties;
}
@Bean
public Customizer circuitBreakerCustomizer() {
return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
.circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
.timeLimiterConfig(TimeLimiterConfig.custom()
.timeoutDuration(serverProperties.getTimeout())
.build())
.build());
}
@Bean
// this is what I want to test
public GatewayFilter circuitBreakerFilter(SpringCloudCircuitBreakerFilterFactory filterFactory) {
return wrapInOrderedGatewayFilter(
filterFactory.apply("route-id",
config -> config.setFallbackUri("/fallback")
));
}
// sometimes filters don't get applied unless wrapped in OrderedGatewayFilter
private static GatewayFilter wrapInOrderedGatewayFilter(GatewayFilter wrappee) {
return new OrderedGatewayFilter(wrappee, 0);
}
@Bean
public RouterFunction fallbackRouterFunction() {
return RouterFunctions.route()
.GET("/fallback", serverRequest -> ServerResponse.status(HttpStatus.GATEWAY_TIMEOUT)
.bodyValue("Timeout!"))
.build();
}
}
Код: Выделить всё
package com.example.gatewaydemo.config;
import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.time.Duration;
@ConfigurationProperties(prefix = "my-app")
@Getter
@Setter
public class ServerProperties {
private Duration timeout;
}
Код: Выделить всё
# application.yml
my-app:
timeout: 5s
Код: Выделить всё
4.0.0
org.springframework.boot
spring-boot-starter-parent
3.1.5
Источник: [url]https://stackoverflow.com/questions/78134394/how-do-i-test-spring-clouds-circuit-breaker-filter[/url]
Мобильная версия