什么是网关过滤器?怎样实现自定义过滤器?

请问一下,什么是网关过滤器?怎样实现自定义过滤器?
最新回答
杯酒入怀

2026-10-30 10:54:03

网关过滤器是网关的核心组件,用于在请求路由到微服务前后执行自定义逻辑。以下是详细解答:

一、网关过滤器的作用

网关过滤器分为两类:

  1. GatewayFilter(路由过滤器)

    作用范围:可针对特定路由配置

    执行时机:在请求路由到指定微服务前后执行

    配置方式:需在YAML文件中指定生效的路由

  2. GlobalFilter(全局过滤器)

    作用范围:对所有请求生效

    执行时机:在请求处理的全流程前后执行

    配置方式:自动生效,无需额外配置

二、过滤器的执行流程
  1. Pre阶段(请求处理前)

    按顺序执行所有过滤器的pre逻辑

    若任一过滤器拦截请求,后续过滤器不再执行

  2. 路由阶段

    所有pre逻辑通过后,请求被转发到微服务

  3. Post阶段(响应处理后)

    按倒序执行所有过滤器的post逻辑

    可对微服务返回结果进行统一处理

三、自定义过滤器实现方式1. 自定义GatewayFilter

需继承AbstractGatewayFilterFactory,示例代码:

@Componentpublic class PrintAnyGatewayFilterFactory extends AbstractGatewayFilterFactory<Config> { // 配置类 public static class Config { private String a; private String b; private String c; // getters/setters... } @Override public GatewayFilter apply(Config config) { return (exchange, chain) -> { // 使用配置参数 System.out.println("a = " + config.getA()); System.out.println("b = " + config.getB()); System.out.println("c = " + config.getC()); return chain.filter(exchange); // 放行请求 }; }}

YAML配置示例:

spring: cloud: gateway: routes: - id: my-route uri:
http://example.org
filters: - name: PrintAny args: a: value1 b: value2 c: value32. 自定义GlobalFilter

直接实现GlobalFilter接口,示例代码:

@Componentpublic class PrintAnyGlobalFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { System.out.println("GlobalFilter 执行了"); return chain.filter(exchange); // 放行请求 } @Override public int getOrder() { return 0; // 数值越小优先级越高 }}四、关键注意事项
  1. 执行顺序控制

    GlobalFilter通过实现Ordered接口指定优先级

    GatewayFilter的执行顺序由配置顺序决定

  2. 请求拦截

    调用chain.filter(exchange)表示放行请求

    不调用则表示拦截请求(可返回错误响应)

  3. 配置参数

    GatewayFilter可通过YAML配置参数

    GlobalFilter通常硬编码逻辑或通过其他方式获取配置

五、典型应用场景
  1. 认证鉴权

    在GlobalFilter中统一校验JWT令牌

  2. 请求日志

    记录请求参数和响应时间

  3. 限流熔断

    基于GatewayFilter实现路由级限流

  4. 数据转换

    修改请求/响应报文内容

通过合理使用过滤器,可以实现网关层的统一处理逻辑,避免在每个微服务中重复实现横切关注点功能。