Spring Cloud Gateway无法转发请求至Movies API求助
问题描述
我有一个暴露在9001端口的Movies API,在Win10系统、Java17环境下搭建了运行于9000端口的Spring Cloud Gateway,想要将请求转发至Movies API,但配置后无法实现预期效果。尝试过修改Path参数为/gateway/all/**、/gateway/**,也更换过网关端口(如8080),问题仍未解决。
Movies API 代码
Controller
@RestController @RequestMapping("/api/movies") public class MoviesAPI { private final Logger log = LoggerFactory.getLogger(MoviesAPI.class); private final MovieRepository movieRepository; public MoviesAPI(MovieRepository movieRepository) { this.movieRepository = movieRepository; } @GetMapping public List<Movie> getAll(){ log.info("REST request to get all movies"); return movieRepository.findAll(); } @PostMapping public Optional<Movie> saveMovie(@RequestBody Movie movie){ log.info("REST request to save movie : {}", movie); movie.setLastUpdatedTime(Instant.now()); return Optional.of(movieRepository.save(movie)); } @GetMapping("/{id}") public Optional<Movie> getMovieById(@PathVariable UUID id){ log.info("REST request to get movie by id : {}", id); return movieRepository.findById(id); } @DeleteMapping("/{id}") public void deleteMovie(@PathVariable UUID id) { log.info("REST request to delete movie by id : {}", id); if (movieRepository.existsById(id)) { movieRepository.deleteById(id); } else { throw new RuntimeException("Movie with ID " + id + " not found"); } } }
application.yml
server: port: 9001 spring: data: mongodb: host: localhost port: 27017 database: movies1 # swagger-ui custom path springdoc: swagger-ui: path: /swagger-ui.html
主应用类
@SpringBootApplication public class SmartProxyJavocApplication { public static void main(String[] args) { SpringApplication.run(SmartProxyJavocApplication.class, args); } }
Gateway API 代码
Controller
@RestController @RequestMapping("/gateway") public class GatewayFallback { private final Logger log = LoggerFactory.getLogger(GatewayFallback.class); @GetMapping("/all") public String getAccount() { return "yes"; } }
application.yml
spring: cloud: gateway: routes: - id: route1 # where we send traffic uri: http://localhost:9001/api/movies predicates: - Path=/gateway/all server: port: 9000
主应用类
@SpringBootApplication public class ProxyApplication { public static void main(String[] args) { SpringApplication.run(ProxyApplication.class, args); } }
问题排查与解决方案
1. 路由与内部Controller冲突
网关自身的GatewayFallback中定义了/gateway/all接口,Spring MVC Controller的优先级高于Gateway路由规则,导致路由配置根本不会触发。同时当前路由的uri直接写死为/api/movies,无法适配Movies API的多接口路径。
修正方案:
- 删除网关中
GatewayFallback类的/gateway/all接口,避免路径冲突。 - 调整路由配置,使用路径重写过滤器适配多接口转发:
spring: cloud: gateway: routes: - id: movies_route uri: http://localhost:9001 predicates: - Path=/gateway/movies/** filters: - RewritePath=/gateway/movies/(?<segment>.*), /api/movies/${segment} server: port: 9000
此时:
- 请求
http://localhost:9000/gateway/movies会转发到http://localhost:9001/api/movies(对应getAll接口) - 请求
http://localhost:9000/gateway/movies/{id}会转发到http://localhost:9001/api/movies/{id}(对应getMovieById接口)
2. 检查依赖冲突
确保Gateway项目的pom.xml只引入Spring Cloud Gateway依赖,移除spring-boot-starter-web(Gateway基于WebFlux,与Spring MVC冲突):
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> </dependencies>
3. 验证服务可用性
- 直接访问
http://localhost:9001/api/movies,确认Movies API正常返回数据。 - 检查Win10防火墙是否拦截9000/9001端口的通信。
内容的提问来源于stack exchange,提问作者S H
相关产品推荐
相关产品推荐

