Spring Cloud Gateway中GatewayFilter Factories(网关过滤工厂)的详细介绍

文章目录

    • 1、网关过滤工厂介绍
    • 2、 GatewayFilter 过滤器的基本配置
    • 3、 Spring Cloud Gateway 内置 GatewayFilter Factories
      • 3.1、AddRequestHeader GatewayFilter
      • 3.2、AddResponseHeader GatewayFilter
      • 3.3、AddRequestParameter GatewayFilter
      • 3.4、RewritePath GatewayFilter
      • 3.5、 RemoveRequestHeader GatewayFilter
      • 3.6、 RemoveResponseHeader GatewayFilter
      • 3.7、StripPrefix GatewayFilter
      • 3.8、 SetPath GatewayFilter
      • 3.9、 Retry GatewayFilter
      • 3.10、CircuitBreaker GatewayFilter
      • 3.11、RateLimit GatewayFilter
    • 4、 组合多个 GatewayFilter
    • 5、自定义 GatewayFilter
    • 6、总结

1、网关过滤工厂介绍

在 Spring Cloud Gateway 中,GatewayFilter Factories(网关过滤工厂) 主要用于 拦截和修改 HTTP 请求或响应,可以在请求被路由到目标服务之前或者返回客户端之前进行处理。

作用范围:

  • 前置过滤(Pre-Filter):在请求被转发到下游服务前执行,如权限校验、日志记录、参数修改等。

  • 后置过滤(Post-Filter):在请求处理完毕返回响应时执行,如添加响应头、记录响应日志等。

路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器的作用范围仅限于特定的路由。Spring Cloud Gateway 包含许多内置的 GatewayFilter 工厂。

2、 GatewayFilter 过滤器的基本配置

在 Spring Cloud Gateway 中,网关过滤器可以通过以下两种方式配置:

  • 方式 1:YAML 配置

  • 方式 2:Java 代码配置(基于 RouteLocator)

3、 Spring Cloud Gateway 内置 GatewayFilter Factories

Spring Cloud Gateway 提供了多个内置的过滤器工厂,下面是详细介绍。

3.1、AddRequestHeader GatewayFilter

在请求头中添加一个新的 Header

YAML 配置:

filters:
  - AddRequestHeader=X-MyHeader, MyHeaderValue

Java 配置:

.filters(f -> f.addRequestHeader("X-MyHeader", "MyHeaderValue"))

✅ 示例:在所有请求中添加 X-MyHeader: MyHeaderValue

3.2、AddResponseHeader GatewayFilter

在响应头中添加一个新的 Header

YAML 配置:

filters:
  - AddResponseHeader=X-Response-Header, ResponseValue

Java 配置:

.filters(f -> f.addResponseHeader("X-Response-Header", "ResponseValue"))

✅ 示例:在所有响应中添加 X-Response-Header: ResponseValue

3.3、AddRequestParameter GatewayFilter

在请求参数中添加一个新的参数

YAML 配置:

filters:
  - AddRequestParameter=username, admin

Java 配置:

.filters(f -> f.addRequestParameter("username", "admin"))

✅ 示例:给请求添加 ?username=admin

3.4、RewritePath GatewayFilter

修改请求路径(支持正则表达式)

YAML 配置:

filters:
  - RewritePath=/oldpath/(?>.*), /newpath/$\{segment}

Java 配置:

.filters(f -> f.rewritePath("/oldpath/(?.*)", "/newpath/${segment}"))

✅ 示例:

请求 /oldpath/user/123 ➝ 重写为 /newpath/user/123

3.5、 RemoveRequestHeader GatewayFilter

移除某个请求头

filters:
  - RemoveRequestHeader=Authorization

✅ 示例:移除 Authorization 头部,避免敏感信息泄露。

3.6、 RemoveResponseHeader GatewayFilter

移除某个响应头

filters:
  - RemoveResponseHeader=Server

✅ 示例:隐藏 Server 响应头,提升安全性。

3.7、StripPrefix GatewayFilter

移除 URL 路径的前缀

YAML 配置:

filters:
  - StripPrefix=2

✅ 示例:

http://gateway-service/api/v1/user
➝ 移除前 2 个路径部分
➝ 变为 http://backend-service/user

3.8、 SetPath GatewayFilter

直接替换整个 URL 路径

filters:
  - SetPath=/new-path

✅ 示例:/old-path 直接变成 /new-path

3.9、 Retry GatewayFilter

在请求失败时自动重试

filters:
  - name: Retry
    args:
      retries: 3
      statuses: 500, 502
      methods: GET, POST

✅ 示例:如果下游服务返回 500,最多重试 3 次。

3.10、CircuitBreaker GatewayFilter

实现熔断机制,依赖 Resilience4J

filters:
  - name: CircuitBreaker
    args:
      name: myCircuitBreaker
      fallbackUri: forward:/fallback

✅ 示例:

如果某个服务调用失败,就执行 /fallback 逻辑

3.11、RateLimit GatewayFilter

限流

使用 Redis 进行限流

filters:
  - name: RequestRateLimiter
    args:
      redis-rate-limiter.replenishRate: 10
      redis-rate-limiter.burstCapacity: 20
      key-resolver: "#{@userKeyResolver}"

✅ 示例:

  • 每秒最多 10 个请求

  • 瞬时最大 20 个请求

4、 组合多个 GatewayFilter

多个 filters 可以一起使用:

filters:
  - AddRequestHeader=X-MyHeader, Value
  - RewritePath=/api/(?>.*), /$${segment}
  - Retry=3,500,GET

这个配置会:

  • 添加请求头

  • 重写路径

  • 请求失败时重试

5、自定义 GatewayFilter

如果内置过滤器不能满足需求,可以自己扩展:

@Component
public class CustomGatewayFilter implements GatewayFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest().mutate()
            .header("X-Custom-Header", "MyValue")
            .build();
        return chain.filter(exchange.mutate().request(request).build());
    }

    @Override
    public int getOrder() {
        return Ordered.LOWEST_PRECEDENCE;
    }
}

✅ 这个过滤器会自动在所有请求中添加 X-Custom-Header: MyValue

6、总结

名称 参数 (个数/类型) 作用
AddRequestHeader 2/string 添加请求头
AddRequestHeadersIfNotPresent 1/List 如果没有则添加请求头,key:value方式
AddRequestParameter 2/string、string 添加请求参数
AddResponseHeader 2/string、string 添加响应头
CircuitBreaker 1/string 仅支持forward:/inCaseOfFailureUseThis方式进行熔断
CacheRequestBody 1/string 缓存请求体
DedupeResponseHeader 1/string 移除重复响应头,多个用空格分割
FallbackHeaders 1/string 设置Fallback头
JsonToGrpc 请求体Json转为gRPC
LocalResponseCache 2/string 响应数据本地缓存
MapRequestHeader 2/string 把某个请求头名字变为另一个名字
ModifyRequestBody 仅 Java 代码方式 修改请求体
ModifyResponseBody 仅 Java 代码方式 修改响应体
PrefixPath 1/string 自动添加请求前缀路径
PreserveHostHeader 0 保护Host头
RedirectTo 3/string 重定向到指定位置
RemoveJsonAttributesResponseBody 1/string 移除响应体中的某些Json字段,多个用,分割
RemoveRequestHeader 1/string 移除请求头
RemoveRequestParameter 1/string 移除请求参数
RemoveResponseHeader 1/string 移除响应头
RequestHeaderSize 2/string 设置请求大小,超出则响应431状态码
RequestRateLimiter 1/string 请求限流
RewriteLocationResponseHeader 4/string 重写Location响应头
RewritePath 2/string 路径重写
RewriteRequestParameter 2/string 请求参数重写
RewriteResponseHeader 3/string 响应头重写
SaveSessio n 0 session保存,配合spring-session框架
SecureHeaders 0 安全头设置
SetPath 1/string 路径修改
SetRequestHeader 2/string 请求头修改
SetResponseHeader 2/string 响应头修改
SetStatus 1/int 设置响应状态码
StripPrefix 1/int 路径层级拆除
Retry 7/string 请求重试设置
RequestSize 1/string 请求大小限定
SetRequestHostHeader 1/string 设置Host请求头
TokenRelay 1/string OAuth2的token转发

Spring Cloud Gateway提供了强大的请求和响应处理能力,可以结合多个过滤器实现复杂的网关功能!
在这里插入图片描述


需要有接受世事无常,接受孤独挫败的勇气


你可能感兴趣的:(spring,cloud,gateway)