Spring Cloud Gateway 2.0前向路径变量

时间:2018-02-05 21:49:00

标签: 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();
}

我在春云[{1}}

中使用spring-cloud-starter-gateway

2 个答案:

答案 0 :(得分:2)

必须使用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();
    }

YAML版本在documentation

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

答案 1 :(得分:0)

经过一些研究,请在下面找到对我有用的东西。两种方法都会产生相同的结果。

这是我的设置:

  • 网关正在http://localhost:8090
  • 上运行
  • 名为/context的基本路径用作网关的入口点
  • my-resources上运行的名为http://localhost:8091/my-resources的服务。如果在没有参数的情况下调用/my-resources,则会返回所有资源。当使用参数调用它时,它将返回具有相应RID(如果有)
  • 的资源

配置网关,以便将传输到http://localhost:8090/context/my-resources/的所有路径变量(可能都没有)转发到uri http://localhost:8091/my-resources/

方法1:使用application.yml

spring:
  cloud:
    gateway:
      routes:
      - id: route_id
        predicates:
        - Path=/context/my-resources/**
        filters:
        - RewritePath=/context/my-resources/(?<RID>.*), /my-resources/$\{RID}
        uri: http://localhost:8091

方法2:使用类似Java的配置

@Bean
public RouteLocator routes(RouteLocatorBuilder routeBuilder) {
    return routeBuilder.routes()
            .route("route_id",
                    route -> route
                            .path("/context/my-resources/**")
                            .filters(f -> f.rewritePath("/context/my-resources/(?<RID>.*)", "/my-resources/${RID}"))
                            .uri("http://localhost:8091")
            )
            .build();
}