You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Cloud Gateway路由机制及后端URI修改方法咨询

Spring Cloud Gateway 请求路由机制解释

Spring Cloud Gateway的请求路由核心依赖RouteLocator定义规则,整体流程如下:

  1. 网关接收请求后,通过RouteLocator加载所有已定义的路由;
  2. 对每个路由的断言(Predicate)集合进行匹配,找到第一个完全匹配的路由;
  3. 执行该路由绑定的过滤器(Filter)集合(分为前置Pre、后置Post过滤器);
  4. 最后由核心路由过滤器(如NettyRoutingFilter)将请求转发到路由指定的后端URI。

结合你提供的代码示例:

public RouteLocator routeLocator(RouteLocatorBuilder builder) {
    return builder.routes()
            //User registration service
            .route("register-user", routeSpec -> routeSpec
                    .path("/register")
                    .and()
                    .method(HttpMethod.POST)
                    .uri("http://localhost:8086/"))
}

这段代码通过RouteLocatorBuilder构建了ID为register-user的路由:

  • 断言规则:仅匹配路径为/register的POST请求;
  • 匹配成功后,请求会被转发到后端服务地址http://localhost:8086/。

路由构建完成后能否通过过滤器修改后端URI?

可以修改,具体细节如下:

1. 持有路由URL的对象

路由的后端URI存储在ServerWebExchange的GATEWAY_ROUTE_ATTR属性中,通过exchange.getAttribute(GATEWAY_ROUTE_ATTR)可获取到Route对象,调用其getUri()方法即可拿到当前的后端URI。

2. 修改位置与实现方式

必须在**前置过滤器(Pre Filter)**中修改,因为网关的核心路由转发逻辑(如NettyRoutingFilter)是在前置过滤器之后执行的,只有前置过滤器能在转发前调整路由信息。

实现时需要自定义过滤器(全局过滤器GlobalFilter或路由绑定的GatewayFilter),并确保过滤器的执行顺序(Ordered接口的getOrder()方法)早于核心路由过滤器(NettyRoutingFilter的order为10000,所以自定义过滤器的order需小于10000)。

示例代码:

@Component
public class ModifyUriFilter implements GlobalFilter, Ordered {
    private static final String GATEWAY_ROUTE_ATTR = "org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR";

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        Route route = exchange.getAttribute(GATEWAY_ROUTE_ATTR);
        // 仅针对目标路由修改URI
        if (route != null && "register-user".equals(route.getId())) {
            URI newUri = URI.create("http://localhost:8087/");
            // 基于原路由构建新路由,替换URI
            Route newRoute = Route.asyncBuilder(route)
                    .uri(newUri)
                    .build();
            // 将新路由放回ServerWebExchange
            exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, newRoute);
        }
        return chain.filter(exchange);
    }

    @Override
    public int getOrder() {
        // 确保在核心路由过滤器前执行
        return 9000;
    }
}

3. 官方文档依据

Spring Cloud Gateway官方文档明确说明,ServerWebExchange中的GATEWAY_ROUTE_ATTR存储了当前匹配到的路由信息,开发者可在前置过滤器中修改该属性,从而调整最终的转发目标URI。核心逻辑是:网关在匹配路由后,会先执行所有前置过滤器,再根据最终的Route对象执行转发。


内容的提问来源于stack exchange,提问作者Robert Don

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 21:36:32