SpringCloud之Gateway

SpringCloud之Gateway

官网地址:
https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#gateway-request-predicates-factories


1. 什么是gateway

Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架,定位于取代 Netflix Zuul。相比 Zuul 来说,Spring CloudGateway 提供更优秀的性能,更强大的有功能。
Spring Cloud Gateway 是由 WebFlux + Netty + Reactor 实现的响应式的 API 网关。它不能在传统的 servlet 容器中工作,也不能构建成 war 包。
Spring Cloud Gateway 旨在为微服务架构提供一种简单且有效的 API 路由的管理方式,并基于 Filter 的方式提供网关的基本功能,例如安全认证、监控、限流等等。


2. 优势

2.1 非阻塞式 & 高性能:

基于 Netty 和 Project Reactor(响应式编程模型)构建,采用异步非阻塞 I/O。

相比传统的同步阻塞式网关(如 Zuul 1.x),它能更高效地处理高并发请求,资源消耗更低,性能显著提升。

2.2 声明式配置:

支持通过 Java DSL(领域特定语言)或 YAML/Properties 配置文件定义路由规则、断言、过滤器等,配置灵活直观。

2.3 强大的路由能力:

基于多种断言 (Predicate) 精确匹配请求(如路径、方法、Header、Host、Cookie、查询参数、时间、权重等)。

支持动态路由(如从配置中心 Nacos、Consul 动态加载路由配置)。

2.4 丰富的过滤器 (Filter):

提供大量内置过滤器,用于修改请求和响应(如添加/删除 Header、路径重写、参数修改、重定向、Hystrix 熔断、请求限流、重试、修改响应体等)。

支持自定义过滤器,满足特定业务需求(如认证、日志、加解密)。

过滤器分为 GatewayFilter (作用于单个路由) 和 GlobalFilter (作用于所有路由)。

2.5 易于集成:

无缝集成 Spring Cloud Discovery Client(Eureka, Nacos, Consul),实现服务发现和动态路由。

轻松集成 Spring Cloud CircuitBreaker(Resilience4j, Sentinel)实现熔断降级。

集成 Spring Cloud LoadBalancer 实现客户端负载均衡。

与 Spring Security 集成实现 OAuth2/JWT 等安全认证。

2.6 支持 WebSocket:

内置对 WebSocket 路由的支持。


3. 核心特性

Spring Cloud Gateway 的核心处理流程围绕着三个关键概念: 路由 (Route),断言 (Predicate),过滤器 (Filter)

3.1 路由 (Route):

网关的基本构建块。定义了一个请求如何被转发到后端服务(目标 URI)。

包含:

  • ID: 路由的唯一标识符。

  • 目标 URI: 请求最终被转发到的地址(可以是 http://, https://, lb:// (服务名负载均衡), ws://, wss://)。

  • 断言 (Predicates) 集合: 一组匹配规则,决定当前请求是否适用此路由。

  • 过滤器 (Filters) 集合: 一组在处理请求和响应前后执行的逻辑(针对此特定路由)。

示例配置 (YAML):

   spring:cloud:gateway:routes:- id: user_service_route       # 路由IDuri: lb://user-service      # 目标URI (lb:// 表示负载均衡到 user-service)predicates:                  # 断言集合- Path=/api/users/**      # 匹配以 /api/users/ 开头的请求路径filters:                     # 过滤器集合- StripPrefix=1            # 去掉路径前缀1级 (/api/users/foo -> /foo)- AddRequestHeader=X-Request-UserService, gateway-user  # 添加请求头

3.2 断言 (Predicate):

Java 8 的 Predicate 函数式接口实现。

接收 ServerWebExchange 对象(包含 HTTP 请求的所有信息),根据请求的属性(如路径、方法、Header、Host、Cookie、查询参数、时间等)进行逻辑判断。

返回 boolean 值:true 表示请求匹配成功,该路由规则生效;false 表示不匹配。

常见内置断言

  • Path: 请求路径匹配 (Ant 风格或正则表达式)。

  • Method: HTTP 方法匹配 (GET, POST, PUT, DELETE 等)。

  • Header: 检查请求头是否存在或值匹配正则。

  • Host: 匹配请求头 Host 的值。

  • Cookie: 检查指定 Cookie 是否存在或值匹配正则。

  • Query: 检查请求参数是否存在或值匹配正则。

  • After, Before, Between: 基于时间匹配请求。

  • RemoteAddr: 匹配客户端 IP 地址(CIDR 表示法)。

  • Weight: 按权重分组路由(常用于灰度发布)。

多个断言关系: 默认情况下,一个路由中的所有断言必须同时为 true,该路由才算匹配成功(逻辑与 AND)。

3.3 过滤器 (Filter):

基于 Spring Framework GatewayFilter 工厂构建。

在路由匹配成功后,请求被转发到目标服务之前 (pre 逻辑) 和收到目标服务响应之后 (post 逻辑) 执行特定操作。

  • 作用

修改请求 (pre): 添加/修改 Header、参数、路径重写、请求体修改、鉴权、限流、熔断等。

修改响应 (post): 添加/修改 Header、修改状态码、修改响应体、日志记录等。

  • 类型

GatewayFilter: 应用于特定路由。在路由配置的 filters 部分定义。

GlobalFilter: 应用于所有路由。通过 @Bean 方式注册到 Spring 上下文即可生效。常用于全局逻辑如认证、日志、监控。

  • 常见内置过滤器

    AddRequestHeader / AddResponseHeader: 添加请求/响应头。RemoveRequestHeader / RemoveResponseHeader: 移除请求/响应头。SetRequestHeader / SetResponseHeader: 设置(覆盖)请求/响应头。RewritePath: 重写请求路径(正则表达式替换)。PrefixPath: 为请求路径添加前缀。StripPrefix: 移除请求路径的前缀(指定级数)。SetPath: 直接设置请求路径(支持模板变量)。RedirectTo: 重定向(302/301)。SaveSession: 强制保存 WebSession(常用于分布式会话)。SetStatus: 设置响应的 HTTP 状态码。RequestRateLimiter: 请求限流(需集成 Redis 或其它实现)。Retry: 请求重试(配置重试次数、条件等)。Hystrix: 熔断(注意:Spring Cloud 2020.0.0 后移除了 Netflix 堆栈,推荐使用 Resilience4j 或 Sentinel 的过滤器)。ModifyRequestBody / ModifyResponseBody: 高级功能,修改请求/响应体内容(需谨慎使用,性能影响较大)。
    

4. 执行流程

┌────────────┐
│   Client   │  ① 发送 HTTP 请求
└────┬───────┘│
┌────▼────────────┐
│ Gateway Handler │ ② Route Predicate 匹配
│    Mapping      │   - Path / Host / Header / Method …
└────┬────────────┘│ 找到匹配的路由
┌────▼────────────┐
│ Gateway Web     │ ③ 把请求交给 Handler
│   Handler       │
└────┬────────────┘│ 进入该路由的 Filter Chain
┌────▼────────────┐
│  Pre-Filter链   │ ④ 在代理之前执行
│  (限流、鉴权…)    │
└────┬────────────┘│
┌────▼────────────┐
│  Proxy Request  │ ⑤ 转发到下游服务
│  (Netty Client) │
└────┬────────────┘│
┌────▼────────────┐
│ Post-Filter链   │ ⑥ 在代理之后执行
│ (日志、加头…)     │
└────┬────────────┘│
┌────▼────────────┐
│   Client        │ ⑦ 收到最终响应
└─────────────────┘

说明:

步骤组件/类说明
① 接收请求Netty Reactor网关基于 WebFlux + Netty,非阻塞接收。
② 路由匹配RoutePredicateHandlerMapping根据 predicates 判断哪个 Route 命中。
③ 创建执行链FilteringWebHandler把命中的 Route 对应的 GatewayFilter 串成链。
④ Pre-FilterGatewayFilter#filter下游调用前 执行:鉴权、限流、日志、加头。
⑤ 代理请求NettyRoutingFilter使用 Netty 客户端发送 HTTP/HTTPS 请求到下游。
⑥ Post-FilterGatewayFilter#filter拿到响应后 执行:改写响应头、记录耗时、熔断降级。
⑦ 返回客户端NettyWriteResponseFilter把最终响应写回原始客户端连接。

5. 应用

  • 统一入口 & 路由: 所有外部请求统一访问网关,网关根据规则路由到内部微服务。

  • 认证鉴权: 在 GlobalFilter 中实现 JWT 校验、OAuth2 集成、基础认证等,保护后端服务。

  • 限流熔断: 使用 RequestRateLimiter 过滤器(如基于 Redis)进行限流;集成 Resilience4j 或 Sentinel 实现熔断降级,防止服务雪崩。

  • 日志审计: 在 GlobalFilter 中记录请求和响应的关键信息(如请求ID、路径、方法、状态码、耗时等),用于监控和审计。

  • 灰度发布 / 金丝雀发布: 利用 Weight 断言或自定义 Predicate/Filter 实现按权重、Header、Cookie、用户ID 等条件将流量分发到不同版本的服务。

  • 跨域处理 (CORS): 在网关层统一配置 CORS 策略,避免每个微服务单独处理。

  • 路径重写与聚合: 使用 RewritePath, PrefixPath, StripPrefix 等过滤器简化客户端请求路径或适配后端服务路径。对于前端聚合请求,可以考虑使用 ModifyRequestBody/ModifyResponseBody(性能需评估)或结合 GraphQL。

  • 监控集成: 集成 Micrometer 和 Prometheus/Grafana,暴露网关的指标(请求数、耗时、错误率等)。


6. 总结

Spring Cloud Gateway 是一个功能强大、性能优异、易于扩展的现代 API 网关解决方案。它通过路由、断言、过滤器三大核心概念,为微服务架构提供了统一的入口、灵活的请求路由能力、强大的请求/响应处理机制以及必要的横切面功能(安全、限流、熔断、日志等)。其基于响应式编程模型的设计使其在高并发场景下表现卓越。结合 Spring Cloud 生态的其他组件(如服务发现、配置中心、熔断器),Spring Cloud Gateway 是构建健壮、可扩展、易管理的微服务系统的理想选择。

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

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

相关文章

关于获取某目录及子目录下所有文件且不包含隐藏文件

最近比较忙,很少写blog了!!!关于获取目录及子目录下所有文件是常遇到的功能,一般通过递归遍历实现。而生产场景中,一般是遍历nas上的目录,在nas上利用File.listFiles(),在linux系统上无法获取含…

docker可视化管理工具lazydocker

Lazydocker 是一个用 Go 语言编写的命令行 Docker 管理工具。它提供了一个简洁、直观的终端界面,支持键盘和鼠标操作,可通过方向键与快捷键实时查看和管理容器、镜像、网络等资源,大幅简化了原本复杂的命令行操作,提升操作效率。2…

少林寺用什么数据库?

📢📢📢📣📣📣 作者:IT邦德 中国DBA联盟(ACDU)成员,15年DBA工作经验 Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝15万 擅长主流Oracle、MySQL、PG、高斯及…

C语言---万能指针(void *)、查找子串(strncmp函数的应用)多维数组(一维数组指针、二维数组指针)、返回指针值函数、关键字(const)

一、字符串与指针用字符指针指向一个字符串,可以不定义字符数组,而定义字符指针。用字符指针指向字符串中的字符。不能使用指针去改变不能修改的空间。eg1. 运用指针将 src 的内容拷贝到 dest 中去void Strcpy(char *dest, char *src) {while(*src ! \0)…

Keepalived 实战

一、高可用集群基础核心概念与指标集群类型:LB(负载均衡):如 LVS、HAProxy、Nginx,提升吞吐量;HA(高可用):保障核心服务(数据库、Redis)连续性&am…

窗口函数替代子查询的复杂查询简化技巧

窗口函数通过单次扫描完成分析计算,能大幅简化子查询结构并提升性能,尤其在排名、累计计算等场景‌15。以下是核心优化技巧:一、排名场景替代方案‌部门工资排名‌传统子查询需自连接和聚合计数:sqlSELECT e1.name, e1.salary, (S…

深度学习:预训练和warm up的区别

“预训练(Pre-training)”和“Warm-up(预热)”是深度学习中常见的两个训练策略,它们虽然都在训练初期起作用,但本质和目的完全不同。一、预训练(Pre-training)1. 定义预训练是指&…

Apache Ignite中分布式信号量(Distributed Semaphore)的说明和使用示例

这段内容是关于 Apache Ignite 中 分布式信号量(Distributed Semaphore) 的说明和使用示例。我们来一步步解析,帮助你深入理解它的含义和用途。🔹 一、什么是 Semaphore(信号量)? 在并发编程中&…

怎么提升服务器的防攻击能力!

提升服务器的防攻击能力需要从​​架构设计、技术防护、运维管理​​等多维度入手,覆盖网络层、系统层、应用层及数据层的安全防护。以下是具体的策略和实践方法:​​一、基础安全加固:消除自身漏洞​​服务器自身的脆弱性是最常见的攻击入口…

vscode配置rust环境

1.官网下载vscode,安装 2.vscode命令行运行: Invoke-WebRequest https://win.rustup.rs/x86_64 -OutFile rustup-init.exe然后: .\rustup-init.exe3.验证 先配置path: $env:Path ";$env:USERPROFILE\.cargo\bin"查看是…

最新版 HarmonyOS NEXT 开发工具安装教程:如何在 macOS 系统安装 DevEco Studio 5.0.3 编辑器?

最新版 HarmonyOS NEXT 开发工具安装教程:如何在 macOS 系统安装 DevEco Studio 5.0.3 编辑器? 什么是 DevEco Studio? DevEco Studio 是华为为 HarmonyOS 开发的强大集成开发环境(IDE),专为开发 Harmony…

电商项目统一认证方案设计与实战

1. 微服务网关整合 OAuth2.0 设计思路分析 网关整合 OAuth2.0 有两种思路,一种是授权服务器生成令牌, 所有请求统一 在网关层验证,判断权限等操作;另一种是由各资源服务处理,网关只做请求 转发 。 比较常用的是第一种&#xf…

学习Markdown

标题一 标题二 标题三 标题四 标题五 标题六这是一段引用文本直接编写,段落换行是末尾两个以上的空格+回车 或者在段落后加一个空行 粗体语法:使用两个星号 ** 或两个下划线 __ 包围文字:这是粗体文字使用星号 这是__粗体文字__使…

剧本杀系统 App 开发:科技赋能,重塑剧本杀游戏体验

在科技飞速发展的当下,各个行业都在积极寻求与科技的融合,以实现创新和升级。剧本杀行业也不例外,剧本杀系统 App 的开发正是科技赋能的生动体现,它重塑了传统的剧本杀游戏体验,为玩家带来了全新的感受。剧本杀系统 Ap…

wvp-gb28181-pro 只用jar运行

编译前端后npm install --global yarnyarn --registryhttps://registry.npmjs.org installyarn run build,生成的前端文件,会在wvp-GB28181-pro\src\main\resources\static,因为是在resources中,打maven打包后会一起打到jar中&…

深度学习(鱼书)day06--神经网络的学习(后两节)

深度学习(鱼书)day06–神经网络的学习(后两节)一、梯度 像 这样的由全部变量的偏导数汇总而成的向量称为梯度(gradient)。 梯度实现的代码: def numerical_gradient(f, x):h 1e-4 # 0.0001grad…

学习嵌入式的第三十四天-数据结构-(2025.7.29)数据库

数据库基础概念 数据库是用于存储和管理海量数据的应用程序,提供数据增删改查及统计功能(如最大值、最小值、平均数等)。通过SQL语句操作数据,以表格形式管理存储。 数据库分类 关系型数据库 Oracle(大型&#xff0…

STM32——HAL库

总:STM32——学习总纲 一、简介 1.1 CMIS简介 所有厂家为了市场兼容性推出的标准 arm架构 1.2 HAL库简介 1.2.1 各种库优缺点 二、 STM32 Cube固件包 ST公司为CMSIS 中间层开发的pack,包含HAL。 2.1 获取方式 ST官网:st.com/content/st_c…

数据结构-图的相关定义

图-多对多Graph(V,E),图(顶点Vertex,边Edge)图可以没有边,只有一个顶点也叫图,但是单独的一条边,或者一个顶点连一条边,不能叫图有向图:无向图&am…

B 站搜一搜关键词优化:精准触达用户的流量密码

在 B 站内容生态中,搜一搜功能是用户主动获取信息的重要渠道,而关键词优化则是让你的视频在搜索结果中脱颖而出的关键。通过合理优化关键词,能提升视频曝光率,吸引精准流量,为账号发展注入强劲动力。以下从关键词挖掘、…