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

news2025/4/2 1:44:47

文章目录

    • 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/(?<segment>.*), /newpath/$\{segment}

Java 配置:

.filters(f -> f.rewritePath("/oldpath/(?<segment>.*)", "/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>.*), /$${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添加请求头
AddResponseHeader添加响应头
RemoveRequestHeader移除请求头
RemoveResponseHeader移除响应头
RewritePath修改请求路径
SetPath直接替换路径
StripPrefix去除路径前缀
AddRequestParameter添加请求参数
Retry请求失败时重试
CircuitBreaker熔断处理
RateLimit限流

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


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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2325112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务架构:构建可持续演进的微服务架构的原则与实践指南

引言&#xff1a;微服务的价值锚点 某物流公司微服务化后&#xff0c;订单履约周期从2小时缩短至15分钟&#xff0c;但技术债务却以每年200%的速度增长。这个案例揭示了一个关键认知&#xff1a;‌微服务架构的成败不在于技术实现&#xff0c;而在于是否建立有效的演进机制‌。…

C++的四种类型转换

文章目录 const_cast:去掉常量类型的类型转换static_cast:提供编译器认为安全的类型转换&#xff08;在编译阶段完成类型转换&#xff09;reinterpret:类似c风格的强制类型转化dynamic_cast:主要用在继承结构里&#xff0c;可以支持RTTI类型识别的上下转换dynamic_cast<>…

《Python实战进阶》No37: 强化学习入门加餐版3 之 Q-Learning算法可视化升级

连续第4篇文章写Q-Learning算法及可视化 Q-Learning强化学习算法在迷宫寻路中的应用 引言 强化学习是机器学习的一个重要分支&#xff0c;其核心理念是通过与环境的交互来学习最优策略。在上三篇文章中&#xff0c;《Python实战进阶》No37: 强化学习入门&#xff1a;Q-Learn…

漏洞挖掘---灵当CRM客户管理系统getOrderList SQL注入漏洞

一、灵当CRM 灵当CRM是上海灵当信息科技有限公司旗下产品&#xff0c;适用于中小型企业。它功能丰富&#xff0c;涵盖销售、服务、财务等管理功能&#xff0c;具有性价比高、简洁易用、可定制、部署灵活等特点&#xff0c;能助力企业提升经营效益和客户满意度。 二、FOFA-Sear…

Java高频面试之集合-20

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;讲讲 HashSet 的底层实现&#xff1f; HashSet 是 Java 集合框架中用于存储唯一元素的高效数据结构&#xff0c;其底层实…

sort命令:排序

sort&#xff1a;默认首位排序 参数&#xff1a; -n&#xff1a;按整个数字排序 -r&#xff1a;降序 -u&#xff1a;去重 [rootrobin ~]# sort -n aa.txt #按数字排序&#xff08;正序&#xff09; [rootrobin ~]# sort -nr aa.txt #降序 [rootrobin ~]# sort -…

Javaweb后端 AOP快速入门 AOP核心概念 AOP执行流程

AOP是对特定方法编程&#xff0c;把共用都用的方法提取出来&#xff0c;统一维护 AOP基础 AOP快速入门 对原始方法无影响 AOP核心概念 连接点&#xff0c;是原始方法&#xff0c;被控制范围内的原始方法 通知&#xff0c;AOP类里面写的公共的方法 切入点&#xff0c;实际被AO…

deepseek ai 输入法

一、简介 使用java开发一个安卓输入法接入deepseek实现ai聊天&#xff0c;代码已开源。 二、视频演示 deepseek输入法_哔哩哔哩_bilibili 三、开源地址 https://github.com/deepseek/inputmethed 四、技术细节 CustomInputMethodService.java 输入法服务类 MainActivity.…

探究 CSS 如何在HTML中工作

2025/3/28 向全栈工程师迈进&#xff01; 一、CSS的作用 简单一句话——美化网页 <p>Lets use:<span>Cascading</span><span>Style</span><span>Sheets</span> </p> 对于如上代码来说&#xff0c;其显示效果如下&#xff1…

Verilog中X态的危险:仿真漏掉的bug

由于Verilog中X态的微妙语义&#xff0c;RTL仿真可能PASS&#xff0c;而网表仿真却会fail。 目前进行的网表仿真越来越少&#xff0c;这个问题尤其严重&#xff0c;主要是网表仿真比RTL仿真慢得多&#xff0c;因此对整个回归测试而言成本效益不高。 上面的例子中&#xff0c;用…

使用 uv 管理 Python 项目

介绍 首先, uv 工具是使用 rust 开发出来的, 速度要比传统的 pip, pipx 等一众包管理工具要快不少. 另外, 除了包管理之外, uv 还提供了脚手架的功能, 使用体验和前端开发使用过的 vue-cli 很相似, 可以帮助我们自动初始化项目, 创建好一个空的包含必要文件结构的文件夹. 此外…

《C++11:通过thread类编写C++多线程程序》

关于多线程的概念与理解&#xff0c;可以先了解Linux下的底层线程。当对底层线程有了一定程度理解以后&#xff0c;再学习语言级别的多线程编程就轻而易举了。 【Linux】多线程 -&#xff1e; 从线程概念到线程控制 【Linux】多线程 -&#xff1e; 线程互斥与死锁 语言级别的…

19-dfs-排列数字(基础)

题目 来源 842. 排列数字 - AcWing题库 思路 由于相对简单&#xff0c;是dfs的模板题&#xff0c;具体思路详见代码 代码 #include<bits/stdc.h> using namespace std; const int N10; int state[N],path[N];//是否使用过&#xff0c;当前位置 int n; void dfs(int …

32.代码题

接着上集...... 派对&#xff1a;超时了&#xff0c;总该受到惩罚吧&#xff1f; 洛西&#xff1a;至于吗&#xff1f;就0.1秒&#xff01; 晴/宇&#xff1a;十分应该。 洛西&#xff1a;我..................... 没办法&#xff0c;洛西只能按照要求去抓R了。 1.P1102 …

nacos 3.x Java SDK 使用详解

Nacos 3.x Java SDK 使用详解 Nacos 3.x 是云原生服务治理的重要升级版本&#xff0c;其 Java SDK 在性能、协议和扩展性上均有显著优化。 一、环境要求与依赖配置 基础环境 JDK 版本&#xff1a;需使用 JDK 17&#xff08;Nacos 3.x 已放弃对 JDK 8 的支持&#xff09;。Spri…

SPI-NRF24L01

模块介绍 NRF24L01是NORDIC公司生产的一款无线通信芯片&#xff0c;采用FSK调制&#xff0c;内部集成NORDIC自己的Enhanced Short Burst 协议&#xff0c;可以实现点对点或者1对6 的无线通信,通信速率最高可以达到2Mbps. NRF24L01采用SPI通信。 ①MOSI 主器件数据输出&#xf…

python黑科技:无痛修改第三方库源码

需求不符合 很多时候&#xff0c;我们下载的 第三方库 是不会有需求不满足的情况&#xff0c;但也有极少的情况&#xff0c;第三方库 没有兼顾到需求&#xff0c;导致开发者无法实现相关功能。 如何通过一些操作将 第三方库 源码进行修改&#xff0c;是我们将要遇到的一个难点…

一区严选!挑战5天一篇脂质体组学 DAY1-5

Day 1! 前期已经成功挑战了很多期NHANES啦&#xff01;打算来试试孟德尔随机化领域&#xff5e; 随着孟德尔随机化研究的普及&#xff0c;现在孟德尔发文的难度越来越高&#xff0c;简单的双样本想被接收更是难上加难&#xff0c;那么如何破除这个困境&#xff0c;这次我打算…

自学-408-《计算机网络》(总结速览)

文章目录 第一章 计算机网络概述1. 计算机网络的定义2. 计算机网络的基本功能3. 计算机网络的分类4. 计算机网络的层次结构5. 计算机网络的协议6. 计算机网络的组成部分7. 计算机网络的应用8. 互联网的概念 物理层的主要功能第二章 数据链路层和局域网1. 数据链路层的功能2. 局…

【质量管理】纠正、纠正措施和预防的区别与解决问题的四重境界

“质量的定义就是符合要求”&#xff0c;我们在文章【质量管理】人们对于质量的五个错误观念-CSDN博客中提到过&#xff0c;这也是质量大师克劳士比所说的。“质量的系统就是预防”&#xff0c;防止出现产品不良而造成的质量损失。 质量问题的解决可以从微观和宏观两个方面来考…