Spring Cloud Gateway 过滤器详解

1. 过滤器概述

Spring Cloud Gateway 的核心功能之一是过滤器(Filter),它可以在请求路由到目标服务之前(Pre)或之后(Post)对请求和响应进行修改、验证或记录。过滤器是网关实现鉴权、限流、日志、请求改写等功能的核心机制。

2. 过滤器分类

2.1 按作用范围分类

  • 全局过滤器(Global Filter)

    • 对所有路由生效,无需配置即可使用。

    • 常见用途:全局鉴权、日志记录、跨域处理。

    • 示例:NettyWriteResponseFilter(处理响应写入)。

  • 局部过滤器(GatewayFilter)

    • 需通过配置绑定到特定路由,仅对当前路由生效。

    • 示例:AddRequestHeader、RequestRateLimiter。

2.2 按执行阶段分类

  • Pre Filter:在请求路由到目标服务前执行(如鉴权、修改请求头)。

  • Post Filter:在目标服务返回响应后执行(如修改响应头、记录日志)。

3. 过滤器执行流程

  • Spring Cloud Gateway 的请求处理流程如下:
    • 客户端请求 → Pre过滤器 → 路由转发 → 目标服务 → Post过滤器 → 返回响应
    • 过滤器的执行顺序由 @Order 注解或 Ordered 接口实现决定,值越小优先级越高。

4. 内置过滤器示例

Spring Cloud Gateway 提供了多种内置过滤器:

过滤器名称功能描述
AddRequestHeader添加请求头
AddResponseHeader添加响应头
PrefixPath为请求路径添加前缀
Retry请求重试机制
RequestRateLimiter基于令牌桶算法的限流
StripPrefix移除路径前缀

配置示例(YAML)

spring:
  cloud:
    gateway:
      routes:
        - id: demo_route
          uri: http://example.com
          predicates:
            - Path=/api/**
          filters:
            - AddRequestHeader=X-Gateway-Header, Hello
            - StripPrefix=1  # 移除路径中的第一个前缀(如 /api/service → /service)

5. 自定义过滤器

5.1 自定义全局过滤器

实现 GlobalFilter 和 Ordered 接口:

@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest().getHeaders().getFirst("Authorization");
        if (!isValid(token)) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete(); // 拦截请求
        }
        return chain.filter(exchange); // 放行
    }

    @Override
    public int getOrder() {
        return 0; // 执行顺序
    }
}

5.2 自定义局部过滤器

需实现 GatewayFilterFactory,通常通过继承 AbstractGatewayFilterFactory:

@Component
public class LogFilterFactory extends AbstractGatewayFilterFactory<LogFilterFactory.Config> {

    public LogFilterFactory() {
        super(Config.class);
    }

    @Override
    public GatewayFilter apply(Config config) {
        return (exchange, chain) -> {
            System.out.println("请求路径:" + exchange.getRequest().getPath());
            return chain.filter(exchange);
        };
    }

    public static class Config {
        // 可添加配置参数
    }
}

配置使用:

filters:
  - Log  # 自定义过滤器的名称需与类名(LogFilterFactory)去掉"FilterFactory"后的部分匹配

6. 常见应用场景

  • 鉴权认证
    • 校验 Token 或 JWT,拦截非法请求。
  • 日志记录
    • 记录请求路径、响应状态码及耗时。
  • 限流熔断
    • 结合 Redis 或 Sentinel 实现接口限流。
  • 请求/响应修改
  • 添加灰度发布标识头。
  • 重写敏感响应字段。

7. 注意事项

  • 执行顺序:全局过滤器与局部过滤器混合使用时,需通过 @Order 明确优先级。

  • 性能影响:避免在过滤器中执行耗时操作(如同步远程调用)。

  • 异常处理:自定义过滤器中需妥善处理异常,避免网关崩溃。

8. 总结

Spring Cloud Gateway 的过滤器机制提供了高度的灵活性,开发者可通过组合内置过滤器或自定义逻辑实现复杂的业务需求。理解过滤器的生命周期、执行顺序及适用场景,是构建高效网关服务的关键。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值