在Spring云网关中使用Resilience4j为路由配置特定的断路器



我试图在spring云网关中配置Resilience4j,但没有成功。我所找到的都是Hystrix或纯java。

我已经将网关配置为在我的服务上传输请求,这是可以的。

但不可能在上面配置reslience4j。我在R4J的reactive中有一个很好的工件。

弹性4j的配置在春季云API和网关中是不同的?

请参阅我的配置文件。

spring:
application:
name: api-gateway
cloud:
gateway:
routes:
- id: helloworld_service
uri: "https://localhost:8080"
predicates:
- Path=/helloworld/**
filters:
- RewritePath=/helloworld/(?<segment>.*), /${segment}
- name: CircuitBreaker
args:
name: helloworld
httpclient:
ssl:
useInsecureTrustManager: true
# RESILIENCE4J PROPERTIES
resilience4j:
circuitbreaker:
configs:
default:
#registerHealthIndicator: true
ringBufferSizeInClosedState: 10
ringBufferSizeInHalfOpenState: 3
automaticTransitionFromOpenToHalfOpenEnabled: true
waitDurationInOpenStateMillis: 2000
failureRateThreshold: 50
eventConsumerBufferSize: 10
instances:
helloworld:
baseConfig: default
ringBufferSizeInClosedState: 5

我的依赖项:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>

并产生错误:

reactor.core.Exceptions$ErrorCallbackNotImplemented: java.lang.IllegalArgumentException: Unable to find GatewayFilterFactory with name CircuitBreaker
Caused by: java.lang.IllegalArgumentException: Unable to find GatewayFilterFactory with name CircuitBreaker

非常感谢你的帮助。

如果您想使用Resiulience4j断路器的外部配置,您需要添加以下依赖项:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

然后在您的spring网关应用程序中,将加载的Circuitbreaker寄存器与您在spring云工厂中的外部配置一起注入:

@Bean
public ReactiveResilience4JCircuitBreakerFactory reactiveResilience4JCircuitBreakerFactory(CircuitBreakerRegistry circuitBreakerRegistry) {
ReactiveResilience4JCircuitBreakerFactory reactiveResilience4JCircuitBreakerFactory = new ReactiveResilience4JCircuitBreakerFactory();
reactiveResilience4JCircuitBreakerFactory.configureCircuitBreakerRegistry(circuitBreakerRegistry);
return reactiveResilience4JCircuitBreakerFactory;
}

然后在exmaple:的application yml文件中添加您的外部断路器配置

resilience4j.circuitbreaker:
configs:
default:
slidingWindowSize: 10
minimumNumberOfCalls: 5
permittedNumberOfCallsInHalfOpenState: 3
automaticTransitionFromOpenToHalfOpenEnabled: true
waitDurationInOpenState: 2s
failureRateThreshold: 50
eventConsumerBufferSize: 10
recordExceptions:
- org.springframework.web.client.HttpServerErrorException
- java.io.IOException
ignoreExceptions:
- java.lang.IllegalStateException
shared:
slidingWindowSize: 100
permittedNumberOfCallsInHalfOpenState: 30
waitDurationInOpenState: 1s
failureRateThreshold: 50
eventConsumerBufferSize: 10
ignoreExceptions:
- java.lang.IllegalStateException
instances:
backendA:
baseConfig: default

使用配置的断路器名称在路线中启用断路器过滤器,例如:

spring:
application:
name: gateway-service
output.ansi.enabled: ALWAYS
cloud:
gateway:
routes:
- id: test-service-withResilient4j
uri: http://localhost:8091
predicates:
- Path=/testService/**
filters:
- CircuitBreaker=backendA
- RewritePath=/testService/(?<path>.*), /${path}

现在应该用外部配置的断路器来保护它,否则你可以通过自定义的代码配置方法来配置它

当前春季云网关Hoxton.RELEASE自动配置存在问题。您可以使用以下配置来解决此问题。

@Configuration
public class Resilience4JConfiguration {
@Bean
public FallbackHeadersGatewayFilterFactory fallbackHeadersGatewayFilterFactory() {
return new FallbackHeadersGatewayFilterFactory();
}
@Bean
public SpringCloudCircuitBreakerFilterFactory resilience4JCircuitBreakerFactory(
ReactiveResilience4JCircuitBreakerFactory reactiveCircuitBreakerFactory,
ObjectProvider<DispatcherHandler> dispatcherHandlers) {
return new SpringCloudCircuitBreakerResilience4JFilterFactory(reactiveCircuitBreakerFactory, dispatcherHandlers);
}
}

坦克比拉克感谢你的耐心。

我的Resilience4j:配置

@Configuration
public class Resilience4JConfiguration {
/**
* Default Resilience4j circuit breaker configuration
*/
@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() {
return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
.circuitBreakerConfig(CircuitBreakerConfig.custom().minimumNumberOfCalls(5).failureRateThreshold(20).build())
.build());
}
@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> helloworldCircuitBreaker(){
return factory -> {
factory.configure(builder -> builder.circuitBreakerConfig(CircuitBreakerConfig.ofDefaults()).build()
.setCircuitBreakerConfig(CircuitBreakerConfig.custom().minimumNumberOfCalls(10).failureRateThreshold(20).build())
, "helloworldCircuitBreaker");
};
}
@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> accountCircuitBreaker(){
return factory -> {
factory.configure(builder -> builder.circuitBreakerConfig(CircuitBreakerConfig.ofDefaults()).build(), "accountCircuitBreaker");
};
}
@Bean
public FallbackHeadersGatewayFilterFactory fallbackHeadersGatewayFilterFactory() {
return new FallbackHeadersGatewayFilterFactory();
}
@Bean
public SpringCloudCircuitBreakerFilterFactory resilience4JCircuitBreakerFactory(
ReactiveCircuitBreakerFactory reactiveCircuitBreakerFactory,
ObjectProvider<DispatcherHandler> dispatcherHandlers) {
return new SpringCloudCircuitBreakerResilience4JFilterFactory(reactiveCircuitBreakerFactory, dispatcherHandlers);
}
}

我的申请.yaml:

spring:
application:
name: api-gateway
cloud:
gateway:
routes:
- id: helloworld_service
uri: "https://localhost:8080"
predicates:
- Path=/helloworldservice/**
filters:
- CircuitBreaker

使用此配置,它将正确使用默认配置。

但是,如果我试图精确确定特定的断路器,则不会使用任何配置(没有默认值,也没有helloworldCiruitBreaker(

特定断路器配置:

spring:
application:
name: api-gateway
cloud:
gateway:
routes:
- id: helloworld_service
uri: "https://localhost:8080"
predicates:
- Path=/helloworldservice/**
filters:
- name: CircuitBreaker
args:
name: helloworldCircuitBreaker

确保添加以下依赖项:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>

现在,在您的spring-gateway应用程序中,创建bean:

@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() {
return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
.circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
.timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(4)).build()).build());
}

现在,application.yml应该看起来像

spring:
application:
name: CLOUD-GATEWAY
cloud:
gateway:
routes:
- id: order-service
uri: lb://ORDER-SERVICE
predicates:
- Path=/orders**
filters:
- name: CircuitBreaker
args:
name: order-service
fallbackuri: forward:/fallback/orders

最新更新