广告
您当前的位置: 首页 >  技术 >  编程开发

服务网关:解密 Spring Cloud Gateway 全局过滤器与 Order 排序

作者:CoderWang 时间:2026-07-08 阅读数:6人阅读

在微服务云原生集群中,API 网关不仅负责流量的动态路由,还承载了**全局限流、统一认证授权、报文加解密、以及分布式链路追踪(Trace)**等横切关注点。在 Spring Cloud Gateway 中,这些跨网络请求的核心拦截均基于 **全局过滤器(GlobalFilter)** 实现。

网关内部包含数十个默认的全局过滤器,开发者也会编写各种自定义过滤器。这几十个过滤器在执行时,是如何排定先后次序的?为什么一个过滤器的逻辑既能充当“前置拦截(Pre)”,又能充当“后置响应(Post)”?这完全基于 Spring Cloud Gateway 的 **责任链模式** 与 **Order 排序** 机制。

本文将系统拆解全局过滤器的底层设计分类、Pre 与 Post 逻辑运行周期、以及自定义低延迟过滤器 Order 排序的代码落地规范。

一、 核心概念对比:网关路由过滤器 vs. 全局过滤器

网关内部两种过滤器在作用范围、装配机制以及生命周期上表现出根本差异:

特征维度路由过滤器 (GatewayFilter)全局过滤器 (GlobalFilter)
作用范围局部。仅对绑定了该 Filter 的特定 Route 路由起作用。**全局**。对网关接收到的**所有路由请求**无差别进行拦截。
配置与装配机制需要在 application.yml 路由节点下显式进行声明。通过 Spring 容器自动扫描,注入 IOC 后自动生效。
核心实现类代表AddRequestHeaderGatewayFilterFactoryNettyRoutingFilter (负责最终转发物理请求)。
执行链合并机制在网关适配时,被包装转换为 GatewayFilterAdapter 统一排队。**直接参与全局拓扑排序**,融合成单一执行链。
---

二、 全局过滤器责任链 Pre / Post 双向流转拓扑

当一个外部请求涌入网关,并触发包含 Token 校验、日志打印和物理转发的过滤器链时,执行逻辑的流转拓扑如下:

      [ 外部客户端请求 (Client Request) ]
                      │
                      ▼ 【 1. 进入网关请求通道:Pre 过滤阶段 】
        ┌───────────────────────────────┐
        │ 2a. AuthFilter (Order = -100)  │  <-- 前置处理:验证 Token 权限
        └───────────────────────────────┘
                      │ (Mono.then 继续向下传递)
                      ▼
        ┌───────────────────────────────┐
        │ 2b. LogFilter (Order = 0)     │  <-- 前置处理:记录请求开始时间戳
        └───────────────────────────────┘
                      │ (Mono.then 继续向下传递)
                      ▼
        ┌───────────────────────────────┐
        │ 2c. NettyRoutingFilter (MAX)  │  <-- 执行核心物理转发 (将请求派发给后端真实微服务)
        └───────────────────────────────┘
                      │
                      ▼ 【 3. 收到后端微服务响应:Post 过滤阶段 】
        ┌───────────────────────────────┐
        │ 4a. LogFilter (Order = 0)     │  <-- 后置处理:打印执行耗时 (currentTime - startTime)
        └───────────────────────────────┘
                      │
                      ▼
        ┌───────────────────────────────┐
        │ 4b. AuthFilter (Order = -100) │  <-- 后置处理:封装公共 Header,并返回客户端
        └───────────────────────────────┘
                      │
                      ▼
      [ 响应客户端 (Client Response) ]
---

三、 代码实战:编写支持 Pre/Post 逻辑的自定义 Ordered 过滤器

以下代码展示了如何实现 GlobalFilter 与 Ordered 接口,编写一个统计 API 耗时的自定义网关过滤器,并严格控制其执行顺序:

1. 自定义过滤器类(Java Layer)

package com.company.infra.gateway.filter;

import org.springframework.cloud.gateway.filter.*;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * 自定义全局过滤器:网络耗时度量过滤器
 */
@Component
public class GatewayLatencyMeasurementFilter implements GlobalFilter, Ordered {

    private static final String START_TIME_KEY = "gateway_request_start_time";

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 【Pre 阶段】:在将请求转发给下游微服务之前执行
        long startTime = System.currentTimeMillis();
        exchange.getAttributes().put(START_TIME_KEY, startTime);
        System.out.println("[Gateway Pre] 拦截请求,记录时间戳: " + startTime);

        // 调用 chain.filter 继续往下投递,并利用 Mono.fromRunnable 挂接响应回调
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            // 【Post 阶段】:在收到后端微服务响应并准备写回客户端时执行
            Long start = exchange.getAttribute(START_TIME_KEY);
            if (start != null) {
                long latency = System.currentTimeMillis() - start;
                // 打印出下游微服务的物理调用耗时
                System.out.println("[Gateway Post] 请求处理完成,物理路由耗时: " + latency + "ms");
                exchange.getResponse().getHeaders().add("X-Gateway-Latency-Ms", String.valueOf(latency));
            }
        }));
    }

    @Override
    public int getOrder() {
        // 核心规约:控制该过滤器在 NettyRoutingFilter(最终物理转发)之前运行。
        // 网关内置路由转发 Filter 的 Order 通常为最大值,所以这里设为 -1,确保 Pre 阶段极早运行,Post 阶段极晚运行。
        return -1;
    }
}

2. 全局过滤器装配配置 application.yml

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
      # 默认全局路由配置
      routes:
        - id: member-route
          uri: lb://member-service
          predicates:
            - Path=/api/members/**
---

四、 总结

Spring Cloud Gateway 的 GlobalFilter 责任链设计与基于 Ordered 排序机制,是保障整个微服务系统入口“流量井然有序”的“指挥中心”。

It 通过**基于 Reactor 反应式框架的 Mono.then() 数据管道设计,在不挂起线程的情况下,精妙地将 Pre 与 Post 双重控制逻辑合并入单一的 Java 拦截器方法中,彻底消除了多线程上下文切换耗时;配合 Order 排序数值比对,确保了各安全认证与物理代理插件的执行次序稳定**。掌握这套全局过滤器责任链异步拦截机制与 Order 自定义代码,是主导微服务网关安全底座研发、对微服务流量链路进行高精度性能调优 of 核心看家本领!

本站所有文章、数据、图片均来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。

评论交流 (0)

正在加载评论...
头像

CoderWang

当你还撑不起你的梦想时,就要去奋斗。如果缘分安排我们相遇,请不要让她擦肩和过。我们一起奋斗!

微信