首页 > 解决方案 > Spring Cloud Gateway:将路径 /a 映射到路径 /b

问题描述

我正在使用 Spring Cloud Gateway 开始一个新的 Spring Boot 项目:我需要为现有的 REST API 实现一个代理应用程序。

代理应用程序将实现新功能(端点),同时将所有发送到现有端点的请求转发给“旧”应用程序。

(然后我将按照类似于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();

这可能吗?有没有办法将端点映射到另一个端点?

标签: javaspring-bootspring-cloudspring-cloud-gateway

解决方案


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

您可以通过查看org.springframework.cloud.gateway.discovery.DiscoveryClientRouteDefinitionLocator.

所以一个简单的例子可以解决你的用例RouteDefinitionLocatorInMemoryRouteDefinitionRepository

如果您想继续使用高级 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();

推荐阅读