Spring Cloud Gateway:将路径/ a映射到路径/ b

时间:2020-02-14 13:36:59

标签: java spring-boot spring-cloud spring-cloud-gateway

我正在使用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();

这可能吗?有什么方法可以将端点映射到另一个端点?

1 个答案:

答案 0 :(得分:1)

在云网关中,有一个org.springframework.cloud.gateway.route.RouteDefinition可以通过应用FilterDefinitionPredicateDefinition将传入请求映射到上游。

您可以通过查看org.springframework.cloud.gateway.discovery.DiscoveryClientRouteDefinitionLocator来了解其工作原理。

因此,简单的RouteDefinitionLocator例如InMemoryRouteDefinitionRepository可以解决您的用例。

如果您希望使用高级api,那么org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder.RouteSpec#predicateBuilderorg.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();