Spring Cloud Gateway 2.0 转发路径变量

Evg*_*rov 5 java spring gateway

如何在 Spring Cloud Gateway 2.0 中转发路径变量?

如果我们有一个微服务,它有 2 个端点:/users并且/users/{id}在端口 8080 上运行,如何将请求转发到具有 id 路径变量的端点?

以下网关配置成功转发到/users端点,但第二条路由将请求转发到/users真实服务的同一端点。

@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("users", t -> t.path("/users").uri("http://localhost:8080/users"))
        .route("userById", t -> t.path("/users/**").uri("http://localhost:8080/users/"))
        .build();
}
Run Code Online (Sandbox Code Playgroud)

我正在使用spring-cloud-starter-gatewayspring cloudFinchley.BUILD-SNAPSHOT

Evg*_*rov 8

rewritePath滤波器必须使用:

@Bean
public RouteLocator routes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("users", t -> t.path("/users")
                .uri("http://localhost:8080/users"))
            .route("userById", t -> t.path("/users/**")
                .filters(rw -> rw.rewritePath("/users/(?<segment>.*)", "/users/${segment}"))
                .uri("http://localhost:8080/users/"))
        .build();
    }
Run Code Online (Sandbox Code Playgroud)

YAML 版本在文档中指定:

spring:
  cloud:
    gateway:
      routes:
      - id: rewritepath_route
        uri: http://example.org
        predicates:
        - Path=/foo/**
        filters:
        - RewritePath=/foo/(?<segment>.*), /$\{segment}
Run Code Online (Sandbox Code Playgroud)