Tavio's blog Tavio's blog
首页
  • JVM底层原理
  • 邪恶多线程
  • MyBatis底层原理
  • Spring底层原理
  • MySQL的优化之路
  • ClickHouse的高性能
  • Redis的快速查询
  • RabbitMQ的生产
  • Kafka的高吞吐量
  • ES的入门到入坑
  • MySQL自增ID主键空洞
  • 前端实现长整型排序
  • MySQL无感换表
  • Redis延时双删
  • 高并发秒杀优惠卷
  • AOP无侵入式告警
  • 长短链接跳转
  • 订单超时取消
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

Tavio Zhang

努力学习的小码喽
首页
  • JVM底层原理
  • 邪恶多线程
  • MyBatis底层原理
  • Spring底层原理
  • MySQL的优化之路
  • ClickHouse的高性能
  • Redis的快速查询
  • RabbitMQ的生产
  • Kafka的高吞吐量
  • ES的入门到入坑
  • MySQL自增ID主键空洞
  • 前端实现长整型排序
  • MySQL无感换表
  • Redis延时双删
  • 高并发秒杀优惠卷
  • AOP无侵入式告警
  • 长短链接跳转
  • 订单超时取消
关于
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • Spring Boot 自动配置
  • Spring Boot Bean 生命周期
  • Spring事务传播机制
  • Spring Cloud Nacos 深度解析
  • Spring Cloud OpenFeign 深度解析
  • Spring Cloud Gateway 底层原理
    • 一、核心定位与技术选型
      • 1.1 核心定位
      • 1.2 技术选型底层逻辑
    • 二、核心架构与核心组件
      • 2.1 核心组件详解
      • 2.1.1 Route(路由)
      • 2.1.2 Predicate(断言)
      • 2.1.3 Filter(过滤器)
      • 2.2 核心架构组件协同关系
    • 三、请求处理全流程底层解析
      • 步骤 1:Netty 接收请求
      • 步骤 2:请求进入 WebFlux DispatcherHandler
      • 步骤 3:RoutePredicateHandlerMapping 匹配路由
      • 步骤 4:FilteringWebHandler 构建并执行过滤器链
      • 步骤 5:路由转发(NettyRoutingFilter/LoadBalancerClientFilter)
      • 5.1 固定地址转发(uri 为 http:// 开头)
      • 5.2 微服务负载均衡转发(uri 为 lb:// 开头)
      • 步骤 6:过滤器链后置处理
      • 步骤 7:Netty 响应客户端
    • 四、关键特性底层实现
      • 4.1 限流机制(基于 Redis + Lua)
      • 4.2 熔断机制(基于 Resilience4j)
      • 4.3 动态路由
    • 五、核心优势与性能优化点
      • 5.1 核心优势
      • 5.2 性能优化点
    • 六、总结
  • Spring Cloud Seata 深度解析
  • Spring Cloud Sentinel 深度解析
  • 《Spring》笔记
Tavio
2024-08-21
目录

Spring Cloud Gateway 底层原理

# Spring Cloud Gateway 底层原理深度解析

在微服务架构中,网关作为流量的入口,承担着路由转发、负载均衡、权限校验、限流熔断等核心职责。Spring Cloud Gateway 作为 Spring Cloud 生态中的官方网关解决方案,替代了传统的 Zuul 网关,基于 Spring WebFlux 和 Netty 实现,具备异步非阻塞、高性能、高扩展性等优势。

# 一、核心定位与技术选型

# 1.1 核心定位

Spring Cloud Gateway 是一款基于异步非阻塞模型的网关,核心目标是为微服务架构提供统一的路由管理和流量控制能力。其核心价值在于:

  • 统一入口:所有客户端请求通过网关进入微服务集群,简化客户端与服务端的交互;
  • 路由转发:根据预设规则将请求转发至对应的微服务实例;
  • 流量治理:提供限流、熔断、负载均衡等流量控制能力;
  • 安全防护:集成认证授权、黑白名单、接口加密等安全机制;
  • 监控运维:收集请求日志、指标统计,支持链路追踪。

# 1.2 技术选型底层逻辑

Spring Cloud Gateway 选择 Spring WebFlux + Netty 作为底层技术栈,而非传统的 Servlet 模型,核心原因在于:

  1. 异步非阻塞优势:传统 Servlet 模型基于同步阻塞 IO,每个请求对应一个线程,在高并发场景下线程资源易耗尽,导致性能瓶颈;而 Netty 基于 NIO 模型,通过事件驱动和多路复用机制,单线程可处理大量并发连接,结合 Spring WebFlux 的响应式编程模型(Reactor),进一步提升高并发场景下的吞吐量和响应速度。
  2. Spring 生态无缝集成:Spring WebFlux 是 Spring 官方推出的响应式 Web 框架,与 Spring 生态(如 Spring Boot、Spring Security、Spring Cloud 组件)深度融合,降低开发者的学习成本和集成成本。
  3. 灵活的扩展机制:WebFlux 的 HandlerMapping、WebFilter 等组件为 Gateway 的路由匹配、过滤器链等核心功能提供了天然的扩展支撑。

核心技术栈关系:Spring Cloud Gateway 基于 Spring WebFlux 构建,而 Spring WebFlux 底层依赖 Netty 作为嵌入式服务器,三者形成 "Gateway → WebFlux → Netty" 的底层依赖链。

# 二、核心架构与核心组件

Spring Cloud Gateway 的核心架构围绕 "路由转发" 和 "过滤器链" 展开,核心组件包括 Route(路由)、Predicate(断言)、Filter(过滤器),三者共同构成了 Gateway 的核心工作模型:当请求满足 Predicate 条件时,将通过 Filter 链处理后转发至目标 URI(即 Route 定义的目标服务)。

# 2.1 核心组件详解

# 2.1.1 Route(路由)

Route 是 Gateway 中最基础的组件,代表一条完整的路由规则,包含以下核心属性:

  • id:路由唯一标识(如 "route-user-service");
  • uri:目标服务地址(可分为 lb:// 开头的微服务名称,代表通过负载均衡转发;或 http:// 开头的固定地址);
  • predicates:路由断言集合,只有当所有断言都匹配成功时,该路由才会生效;
  • filters:路由过滤器集合,用于对请求和响应进行拦截和处理;
  • order:路由优先级,数值越小优先级越高(当多个路由都匹配请求时,优先选择优先级高的路由)。

底层数据结构:Route 接口的默认实现为 RouteDefinitionRoute,其创建依赖于 RouteDefinition(路由定义),RouteDefinition 是路由规则的配置载体,包含上述所有属性的配置信息,Gateway 启动时会将 RouteDefinition 解析为 Route 实例并注册到路由注册表中。

# 2.1.2 Predicate(断言)

Predicate 本质是 "请求匹配规则",用于判断当前请求是否符合路由的转发条件。其底层基于 Java 8 的 Predicate 函数式接口,输入参数为 ServerWebExchange(包含请求、响应、上下文等信息),返回值为 boolean(true 表示匹配成功,false 表示匹配失败)。

核心实现逻辑:

  • Gateway 内置了多种常用 Predicate,如路径匹配(Path)、方法匹配(Method)、参数匹配(Query)、请求头匹配(Header)、时间匹配(After/Before/Between)等;
  • 每种内置 Predicate 都对应一个工厂类(如 PathRoutePredicateFactory、MethodRoutePredicateFactory),工厂类负责将配置参数(如 Path=/user/**)解析为 Predicate 实例;
  • 多个 Predicate 之间为 "与" 关系,只有所有 Predicate 都匹配成功,路由才会生效。

源码片段(Predicate 匹配核心逻辑):

// 路由匹配核心方法,位于 RoutePredicateHandlerMapping 类
@Override
protected Mono<Route> getHandlerInternal(ServerWebExchange exchange) {
    // 1. 构建包含请求信息的查找键
    exchange.getAttributes().put(GATEWAY_HANDLER_MAPPER_ATTR, getSimpleName());
    // 2. 遍历所有路由,匹配符合条件的路由(所有 Predicate 都返回 true)
    return lookupRoute(exchange)
            .flatMap(route -> {
                // 3. 匹配成功,将路由信息存入上下文
                exchange.getAttributes().put(GATEWAY_ROUTE_ATTR, route);
                return Mono.just(route);
            })
            .switchIfEmpty(Mono.empty());
}

private Mono<Route> lookupRoute(ServerWebExchange exchange) {
    // 遍历路由注册表中的所有路由
    return this.routeLocator.getRoutes()
            .concatMap(route -> {
                // 匹配当前路由的所有 Predicate
                return Mono.just(route).filterWhen(routePredicate -> {
                    // 执行 Predicate 匹配逻辑
                    return routePredicate.getPredicate().apply(exchange);
                });
            })
            // 选择优先级最高的路由(order 最小)
            .next()
            .map(route -> {
                if (logger.isDebugEnabled()) {
                    logger.debug("Route matched: " + route.getId());
                }
                validateRoute(route, exchange);
                return route;
            });
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

# 2.1.3 Filter(过滤器)

Filter 是 Gateway 实现请求拦截和处理的核心组件,用于在请求转发前/后对请求和响应进行加工(如修改请求头、添加参数、日志记录、权限校验、限流熔断等)。其底层基于 GatewayFilter 接口,核心方法为 filter(ServerWebExchange exchange, GatewayFilterChain chain),通过 GatewayFilterChain 实现过滤器的链式调用。

Filter 分类及核心差异:

分类 作用范围 核心特点 实现方式
GatewayFilter(路由过滤器) 仅作用于指定路由 与具体路由绑定,可通过配置指定生效的路由 内置工厂类(如 AddRequestHeaderGatewayFilterFactory)或自定义实现
GlobalFilter(全局过滤器) 作用于所有路由 无需绑定路由,自动对所有请求生效,常用于全局日志、全局认证等 实现 GlobalFilter 接口并注册为 Bean

过滤器执行顺序:

  • 所有过滤器都通过 Ordered 接口或 @Order 注解指定 order 值,order 数值越小,执行优先级越高;
  • 执行阶段分为 "前置处理" 和 "后置处理":前置处理按 order 升序执行,后置处理按 order 降序执行;
  • GlobalFilter 和 GatewayFilter 会合并为一个过滤器链,统一按 order 排序执行。

# 2.2 核心架构组件协同关系

Spring Cloud Gateway 的核心架构组件可分为 "配置解析层"、"路由匹配层"、"过滤器链层"、"转发层",各层协同工作完成请求处理:

  1. 配置解析层:负责加载路由配置(如 yml 配置、数据库配置),通过 RouteDefinitionLocator 解析为 RouteDefinition,再通过 RouteDefinitionRouteLocator 转换为 Route 实例;
  2. 路由匹配层:通过 RoutePredicateHandlerMapping 遍历 Route 实例,利用 Predicate 匹配请求,找到符合条件的 Route;
  3. 过滤器链层:通过 FilteringWebHandler 构建过滤器链(GlobalFilter + 对应 Route 的 GatewayFilter),按顺序执行前置处理;
  4. 转发层:通过 NettyRoutingFilter 或 LoadBalancerClientFilter 将请求转发至目标服务,获取响应后,执行过滤器链的后置处理,最终将响应返回给客户端。

# 三、请求处理全流程底层解析

Spring Cloud Gateway 的请求处理流程基于 Spring WebFlux 的响应式模型,核心是 "事件驱动 + 链式调用",整个流程可分为 7 个关键步骤,结合源码和逻辑逐一拆解:

# 步骤 1:Netty 接收请求

Gateway 底层依赖 Netty 作为嵌入式服务器,默认监听 8080 端口。当客户端发送 HTTP 请求时,Netty 的 NioEventLoopGroup 线程池会接收请求,通过 ChannelPipeline 进行请求解码(如 HTTP 协议解码),最终将请求封装为 ServerHttpRequest 对象,并创建对应的 ServerWebExchange(请求上下文)。

核心点:Netty 的异步非阻塞特性在此体现,接收请求的线程不会阻塞等待响应,而是通过事件回调继续处理其他请求。

# 步骤 2:请求进入 WebFlux DispatcherHandler

Netty 接收请求后,会将请求传递给 Spring WebFlux 的核心 DispatcherHandler(请求分发器)。DispatcherHandler 是 WebFlux 的入口组件,负责将请求分发给对应的 HandlerMapping(处理器映射器)。

源码片段(DispatcherHandler 核心逻辑):

@Override
public Mono<Void> handle(ServerWebExchange exchange) {
    // 遍历所有 HandlerMapping,找到能处理当前请求的 Handler
    return Flux.fromIterable(this.handlerMappings)
            .concatMap(mapping -> mapping.getHandler(exchange))
            .next()
            .switchIfEmpty(Mono.error(() -> new ResponseStatusException(
                    HttpStatus.NOT_FOUND, "No matching handler")))
            // 执行 Handler(即 Gateway 的过滤器链 + 转发逻辑)
            .flatMap(handler -> invokeHandler(exchange, handler))
            // 处理响应结果
            .flatMap(result -> handleResult(exchange, result));
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 步骤 3:RoutePredicateHandlerMapping 匹配路由

在 Gateway 中,核心的 HandlerMapping 是 RoutePredicateHandlerMapping,其作用是根据请求匹配对应的 Route,并将 Route 封装为 Handler(实际为 FilteringWebHandler)。

核心逻辑:

  • RoutePredicateHandlerMapping 调用 getHandlerInternal 方法(前文源码片段),遍历 RouteLocator 中的所有 Route;
  • 对每个 Route 执行 Predicate 匹配逻辑,找到所有 Predicate 都匹配的 Route;
  • 将匹配成功的 Route 存入 ServerWebExchange 的属性中,返回 FilteringWebHandler 作为当前请求的 Handler。

# 步骤 4:FilteringWebHandler 构建并执行过滤器链

FilteringWebHandler 是 Gateway 中过滤器链的核心处理器,其核心职责是构建过滤器链并执行前置处理逻辑。

核心流程:

  1. 获取当前 Route 对应的 GatewayFilter 集合;
  2. 获取容器中所有的 GlobalFilter 实例,将其转换为 GatewayFilter(通过 GlobalFilterAdapter 适配);
  3. 合并所有 GatewayFilter,按 order 排序,构建成 GatewayFilterChain 过滤器链;
  4. 调用过滤器链的 filter 方法,按顺序执行所有过滤器的前置处理逻辑。

源码片段(过滤器链构建与执行):

@Override
public Mono<Void> handle(ServerWebExchange exchange) {
    // 1. 获取当前路由对应的 GatewayFilter
    Route route = exchange.getRequiredAttribute(GATEWAY_ROUTE_ATTR);
    List<GatewayFilter> gatewayFilters = route.getFilters();
    
    // 2. 获取所有 GlobalFilter 并转换为 GatewayFilter
    List<GatewayFilter> globalFilters = this.globalFilters.stream()
            .map(filter -> new GlobalFilterAdapter(filter))
            .collect(Collectors.toList());
    
    // 3. 合并过滤器并排序(按 order 升序)
    List<GatewayFilter> combined = new ArrayList<>(globalFilters);
    combined.addAll(gatewayFilters);
    combined.sort(AnnotationAwareOrderComparator.INSTANCE);
    
    // 4. 构建过滤器链并执行
    GatewayFilterChain chain = new DefaultGatewayFilterChain(combined);
    return chain.filter(exchange);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 步骤 5:路由转发(NettyRoutingFilter/LoadBalancerClientFilter)

过滤器链的前置处理执行完成后,最终会通过核心转发过滤器将请求转发至目标服务。根据 Route 的 uri 类型,分为两种转发逻辑:

# 5.1 固定地址转发(uri 为 http:// 开头)

由 NettyRoutingFilter 负责转发,核心逻辑:

  • 从 ServerWebExchange 中获取目标 uri 和请求信息(方法、请求头、请求体等);
  • 通过 Netty 的 HttpClient 发送异步 HTTP 请求到目标地址;
  • 接收目标服务的响应,将响应信息封装为 ServerHttpResponse,存入 ServerWebExchange。

# 5.2 微服务负载均衡转发(uri 为 lb:// 开头)

由 LoadBalancerClientFilter 负责转发,核心逻辑:

  • 解析 lb:// 后的微服务名称(如 lb://user-service);
  • 通过 Spring Cloud LoadBalancer(或 Eureka/Consul 客户端)获取该微服务的可用实例列表;
  • 根据负载均衡算法(默认轮询)选择一个实例,将 uri 替换为实例的实际地址(如 http://192.168.1.100:8081);
  • 调用 NettyRoutingFilter 完成最终的请求转发。

核心点:负载均衡的底层依赖 Spring Cloud LoadBalancer 的 ReactorLoadBalancer 接口,通过异步方式获取服务实例,保证整个转发流程的非阻塞特性。

# 步骤 6:过滤器链后置处理

目标服务的响应返回后,会反向执行过滤器链的后置处理逻辑(即按 order 降序执行)。后置处理通常用于响应加工(如修改响应头、添加响应参数)、日志记录(如记录响应时间)、资源清理等。

示例:自定义全局过滤器记录请求响应时间:

@Component
public class ResponseTimeGlobalFilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 前置处理:记录请求开始时间
        long start = System.currentTimeMillis();
        // 执行后续过滤器,获取响应完成后的回调
        return chain.filter(exchange)
                .doFinally(signalType -> {
                    // 后置处理:计算响应时间并记录日志
                    long end = System.currentTimeMillis();
                    System.out.println("请求响应时间:" + (end - start) + "ms");
                });
    }

    @Override
    public int getOrder() {
        return -1; // 优先级较高,确保最先执行前置处理,最后执行后置处理
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# 步骤 7:Netty 响应客户端

过滤器链后置处理完成后,ServerWebExchange 中的响应信息会被传递给 Netty,Netty 将响应编码后发送给客户端,完成整个请求-响应流程。

# 四、关键特性底层实现

# 4.1 限流机制(基于 Redis + Lua)

Gateway 内置的限流功能基于 Redis 和 Lua 脚本实现,核心过滤器为 RequestRateLimiterGatewayFilterFactory,支持令牌桶算法和漏桶算法(默认令牌桶算法)。

底层实现逻辑:

  1. 配置限流规则(如每秒允许 10 个请求,即令牌桶填充速率为 10/s,桶容量为 10);
  2. 请求到达时,执行 Lua 脚本向 Redis 发送限流检查请求;
  3. Lua 脚本基于令牌桶算法判断是否允许请求通过:若允许,从桶中获取 1 个令牌,返回成功;若不允许,返回失败;
  4. 若限流检查失败,Gateway 直接返回 429 Too Many Requests 响应,不转发至目标服务。

核心优势:Lua 脚本的原子性保证了高并发场景下限流规则的准确性,避免出现超限制流的情况;Redis 的高性能支撑了大量请求的限流检查。

# 4.2 熔断机制(基于 Resilience4j)

Gateway 集成 Resilience4j 实现熔断功能(替代传统的 Hystrix),核心过滤器为 Resilience4jGatewayFilterFactory,支持熔断、降级、超时控制等特性。

底层实现逻辑:

  1. 配置熔断规则(如失败率阈值 50%、熔断时长 10s、最小请求数 10);
  2. 请求转发时,通过 Resilience4j 的 CircuitBreaker 组件监控请求的成功/失败状态;
  3. 当失败率达到阈值时,CircuitBreaker 状态从 CLOSED 转为 OPEN,触发熔断,此时后续请求会直接被拦截,执行降级逻辑(如返回默认响应);
  4. 熔断时长结束后,CircuitBreaker 状态转为 HALF_OPEN,允许少量请求尝试访问目标服务:若请求成功,状态转为 CLOSED,恢复正常转发;若仍失败,继续保持 OPEN 状态。

核心点:Resilience4j 基于响应式编程模型实现,与 Gateway 的异步非阻塞架构完全适配,避免了传统 Hystrix 同步阻塞模型的性能问题。

# 4.3 动态路由

Gateway 支持动态路由(无需重启网关即可更新路由规则),其底层核心是 RouteLocator 的动态刷新机制。

实现方式:

  1. 自定义 RouteDefinitionLocator,从数据库、配置中心(如 Nacos、Apollo)等动态数据源加载路由配置;
  2. 通过 ApplicationEventPublisher 发布 RouteRefreshEvent 事件;
  3. RoutePredicateHandlerMapping 监听 RouteRefreshEvent 事件,触发路由缓存刷新,重新加载最新的 Route 实例;
  4. 后续请求会使用最新的路由规则进行匹配。

核心优势:动态路由支持灰度发布、蓝绿部署等场景,提升了网关的灵活性和可运维性。

# 五、核心优势与性能优化点

# 5.1 核心优势

  • 异步非阻塞:基于 Netty 和 WebFlux,高并发场景下吞吐量远高于传统 Zuul 网关;
  • Spring 生态集成:无缝对接 Spring Boot、Spring Security、Spring Cloud 组件(如 LoadBalancer、Resilience4j);
  • 灵活的扩展机制:支持自定义 Predicate、Filter、RouteLocator,满足多样化业务需求;
  • 丰富的内置特性:内置限流、熔断、负载均衡、动态路由等核心功能,开箱即用。

# 5.2 性能优化点

  • 合理配置 Netty 线程池:调整 NioEventLoopGroup 的核心线程数(默认等于 CPU 核心数),根据业务场景优化;
  • 减少过滤器数量:避免不必要的全局过滤器,路由过滤器按需绑定,减少链式调用开销;
  • 启用连接池复用:配置 Netty 客户端连接池,避免频繁创建和销毁连接;
  • 优化路由匹配:避免复杂的 Predicate 规则,优先使用路径匹配等高效规则;
  • 启用响应压缩:配置 spring.cloud.gateway.compression.enabled=true,减少网络传输开销。

# 六、总结

Spring Cloud Gateway 的底层原理围绕 "异步非阻塞" 核心架构展开,基于 Spring WebFlux 和 Netty 构建,通过 Route、Predicate、Filter 三大核心组件实现路由转发和流量治理。其请求处理流程遵循 "Netty 接收请求 → WebFlux 分发 → 路由匹配 → 过滤器链执行 → 转发至目标服务 → 后置处理 → 响应客户端" 的完整链路,各环节通过响应式编程模型保证高并发场景下的性能。

编辑 (opens new window)
#Spring Cloud Gateway 底层原理
上次更新: 2026/01/21, 19:29:14
Spring Cloud OpenFeign 深度解析
Spring Cloud Seata 深度解析

← Spring Cloud OpenFeign 深度解析 Spring Cloud Seata 深度解析→

最近更新
01
订单超时取消
01-21
02
双 Token 登录
01-21
03
长短链接跳转
01-21
更多文章>
Theme by Vdoing
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式