我正在使用Spring Cloud Gateway启动一个新的Spring Boot项目:我需要为现有REST API实现代理应用程序。
代理应用程序将实现所有新功能(端点),同时将所有发送到现有Endint的请求转发到“旧”应用程序。
(然后,我将按照类似于Strangler Pattern的方法,将现有端点也逐渐移至新应用程序中)
但是我还需要重写几个现有端点的路径,例如:
return routeLocatorBuilder.routes()
.route(p -> p
.path("/new-endopint")
.map("/old-endpoint") // <= is there something like 'map' method?
.uri("http://old-app-url")).build();
这可能吗?有什么方法可以将端点映射到另一个端点?
答案 0 :(得分:1)
在云网关中,有一个org.springframework.cloud.gateway.route.RouteDefinition
可以通过应用FilterDefinition
和PredicateDefinition
将传入请求映射到上游。
您可以通过查看org.springframework.cloud.gateway.discovery.DiscoveryClientRouteDefinitionLocator
来了解其工作原理。
因此,简单的RouteDefinitionLocator
例如InMemoryRouteDefinitionRepository
可以解决您的用例。
如果您希望使用高级api,那么org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder.RouteSpec#predicateBuilder
(org.springframework.cloud.gateway.route.builder.GatewayFilterSpec#rewritePath
...)看起来很有希望。
return routeLocatorBuilder.routes()
.routes()
.route(
p ->
p.path("/new-endpoint/**")
.filters(
spec ->
spec.rewritePath(
"/new-endpoint/(?<segment>.*)", "/old-endpoint/${segment}"))
.uri("http://old-app-url"))
.build();