如何在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
答案 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/
。
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
@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();
}