You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 01:00:40