Spring Cloud Gateway断路器步骤启动失败:缺失指定Bean
Spring Cloud Gateway断路器配置启动失败:找不到SpringCloudCircuitBreakerFilterFactory Bean
按照官方指南操作Spring Cloud Gateway,在添加断路器路由配置后启动应用报错,此前仅添加Hello World过滤器的步骤可正常运行,已尝试Java 8和Java 17版本,问题一致。
添加的断路器路由代码
@Bean public RouteLocator myRoutes(RouteLocatorBuilder builder) { return builder.routes() .route(p -> p .path("/get") .filters(f -> f.addRequestHeader("Hello", "World")) .uri("http://httpbin.org:80")) .route(p -> p .host("*.circuitbreaker.com") .filters(f -> f.circuitBreaker(config -> config.setName("mycmd"))) .uri("http://httpbin.org:80")). build(); }
启动报错信息
*************************** APPLICATION FAILED TO START *************************** Description: Method myRoutes in com.example.springcloudgatewaypoc.Application required a bean of type 'org.springframework.cloud.gateway.filter.factory.SpringCloudCircuitBreakerFilterFactory' that could not be found. Action: Consider defining a bean of type 'org.springframework.cloud.gateway.filter.factory.SpringCloudCircuitBreakerFilterFactory' in your configuration.
完整应用代码
package com.example.springcloudgatewaypoc; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.gateway.route.RouteLocator; import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder; import org.springframework.context.annotation.Bean; @SpringBootApplication public class Application { @Bean public RouteLocator myRoutes(RouteLocatorBuilder builder) { return builder.routes() .route(p -> p .path("/get") .filters(f -> f.addRequestHeader("Hello", "World")) .uri("http://httpbin.org:80")) .route(p -> p .host("*.circuitbreaker.com") .filters(f -> f.circuitBreaker(config -> config.setName("mycmd"))) .uri("http://httpbin.org:80")). build(); } public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
Java 1.8对应的pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.4</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>spring-cloud-gateway-poc</artifactId> <version>0.0.1-SNAPSHOT</version> <name>spring-cloud-gateway-poc</name> <description>Demo project for Spring Cloud Gateway</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>2021.0.4</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId> </dependency> <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> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-contract-stub-runner</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.7.4</version> </plugin> </plugins> </build> </project>
解决方案
问题根源是依赖适配问题:Spring Cloud Gateway基于WebFlux响应式编程模型,需要使用Reactor版本的断路器依赖,而非普通的Resilience4J断路器依赖。你的pom.xml中仅在dependencyManagement中声明了spring-cloud-starter-circuitbreaker-reactor-resilience4j,但未在dependencies块中引入,同时错误引入了非响应式的spring-cloud-starter-circuitbreaker-resilience4j。
修正步骤:
- 删除
dependencies中的spring-cloud-starter-circuitbreaker-resilience4j依赖 - 在
dependencies中添加spring-cloud-starter-circuitbreaker-reactor-resilience4j依赖
修正后的dependencies块如下:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId> </dependency> <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> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-contract-stub-runner</artifactId> <scope>test</scope> </dependency> </dependencies>
同时可以移除dependencyManagement中单独声明的spring-cloud-starter-circuitbreaker-reactor-resilience4j,因为spring-cloud-dependencies已经管理了该依赖的版本。
内容的提问来源于stack exchange,提问作者techieIntern
相关产品推荐
相关产品推荐

