2026-10-30 10:54:03
网关过滤器是网关的核心组件,用于在请求路由到微服务前后执行自定义逻辑。以下是详细解答:
一、网关过滤器的作用网关过滤器分为两类:
GatewayFilter(路由过滤器)
作用范围:可针对特定路由配置
执行时机:在请求路由到指定微服务前后执行
配置方式:需在YAML文件中指定生效的路由
GlobalFilter(全局过滤器)
作用范围:对所有请求生效
执行时机:在请求处理的全流程前后执行
配置方式:自动生效,无需额外配置
Pre阶段(请求处理前)
按顺序执行所有过滤器的pre逻辑
若任一过滤器拦截请求,后续过滤器不再执行
路由阶段
所有pre逻辑通过后,请求被转发到微服务
Post阶段(响应处理后)
按倒序执行所有过滤器的post逻辑
可对微服务返回结果进行统一处理
需继承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:直接实现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; // 数值越小优先级越高 }}四、关键注意事项执行顺序控制
GlobalFilter通过实现Ordered接口指定优先级
GatewayFilter的执行顺序由配置顺序决定
请求拦截
调用chain.filter(exchange)表示放行请求
不调用则表示拦截请求(可返回错误响应)
配置参数
GatewayFilter可通过YAML配置参数
GlobalFilter通常硬编码逻辑或通过其他方式获取配置
在GlobalFilter中统一校验JWT令牌
记录请求参数和响应时间
基于GatewayFilter实现路由级限流
修改请求/响应报文内容
通过合理使用过滤器,可以实现网关层的统一处理逻辑,避免在每个微服务中重复实现横切关注点功能。