一、Spring Cloud Gateway 简介

Spring Cloud Gateway 是基于 Spring 5、Project Reactor 和 Spring Boot 2 构建的 API 网关,旨在为微服务架构提供一种简单而有效的路由管理方式。它取代了 Netflix Zuul,提供了更高效和更强大的网关解决方案。

核心特点:

  • ​反应式编程模型​​:基于 Project Reactor 的非阻塞高性能处理
  • ​路由管理​​:支持灵活的路由匹配规则
  • ​过滤器机制​​:提供全局和局部过滤器处理请求和响应
  • ​易于扩展​​:可通过自定义过滤器和路由器扩展功能

二、Spring Cloud Gateway 核心概念

1. 三大核心组件

  1. ​Route(路由)​​:网关的基本构建块,定义了请求路径与服务之间的映射关系
  2. ​Predicate(断言)​​:Java 8 的 Predicate,用于匹配 HTTP 请求中的任何内容(如 headers 或参数)
  3. ​Filter(过滤器)​​:可以在请求被路由前后修改请求和响应的组件

2. 工作流程

  1. 客户端向 Spring Cloud Gateway 发出请求
  2. 如果 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler
  3. Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回

三、Spring Boot 项目中集成 Gateway

1. 添加依赖

在 Maven 项目的 pom.xml 文件中添加以下依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId><version>4.3.0</version> <!-- 版本号根据实际情况选择 -->
</dependency>

对于 Gradle 项目,在 build.gradle 中添加:

implementation 'org.springframework.cloud:spring-cloud-starter-gateway:2.2.6.RELEASE'

2. 启用网关

在 Spring Boot 应用程序的入口类上,通常不需要特殊注解,因为 Spring Cloud Gateway 会自动配置。但如果你使用的是较新版本,可能需要确保有 @SpringBootApplication 注解:

@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}

四、Spring Cloud Gateway 的 YML 配置详解

Spring Cloud Gateway 的路由配置主要通过 application.ymlapplication.properties 文件完成。下面详细介绍 YML 配置文件的规则与使用。

1. 基本路由配置结构

spring:cloud:gateway:routes:- id: route_id              # 路由的唯一标识符,必须唯一uri: http://example.com   # 目标服务的URIpredicates:               # 断言列表,用于匹配请求- Path=/example/**      # 示例断言:匹配以/example/开头的路径filters:                  # 过滤器列表,用于处理请求和响应- StripPrefix=1         # 示例过滤器:去除路径中的第一层前缀

2. 配置项详细说明

2.1 路由 (Routes)

routes 是一个路由配置的数组,每个路由包含以下主要属性:

  • ​id​​ (必需): 路由的唯一标识符,用于标识和引用该路由
  • ​uri​​ (必需): 请求最终要被转发的目标地址
    • 可以是普通的 HTTP/HTTPS URL,如 http://example.com
    • 也可以使用服务发现机制,如 lb://SERVICE-NAME (负载均衡)
  • ​predicates​​ (可选): 断言数组,用于判断请求是否符合路由条件
  • ​filters​​ (可选): 过滤器数组,用于在请求转发前后进行处理
  • ​order​​ (可选): 路由的优先级,数字越小优先级越高
2.2 断言 (Predicates)

断言用于匹配 HTTP 请求中的各种条件,常用的断言类型包括:

  1. ​Path​​ - 路径匹配

    predicates:- Path=/api/**           # 匹配以/api/开头的路径
  2. ​Method​​ - HTTP 方法匹配

    predicates:- Method=GET,POST        # 匹配 GET 或 POST 请求
  3. ​Header​​ - 请求头匹配

    predicates:- Header=X-Request-Id, \d+  # 匹配包含 X-Request-Id 头且值为数字的请求
  4. ​Query​​ - 查询参数匹配

    predicates:- Query=name, \d+        # 匹配包含 name 参数且值为数字的请求
  5. ​Host​​ - 主机名匹配

    predicates:- Host=**.example.com    # 匹配主机名为任意子域名.example.com 的请求
  6. ​Before/After/Between​​ - 时间匹配

    predicates:- Before=2023-01-01T00:00:00+08:00[Asia/Shanghai]  # 在指定时间之前匹配- After=2023-01-01T00:00:00+08:00[Asia/Shanghai]   # 在指定时间之后匹配- Between=2023-01-01T00:00:00+08:00[Asia/Shanghai], 2023-12-31T23:59:59+08:00[Asia/Shanghai]
  7. ​Cookie​​ - Cookie 匹配

    predicates:- Cookie=chocolate, ch.p  # 匹配包含名为 chocolate 且值匹配正则 ch.p 的 Cookie
2.3 过滤器 (Filters)

过滤器用于在请求转发前后进行处理,分为两种类型:

  1. ​GatewayFilter​​ - 单个路由的过滤器
  2. ​GlobalFilter​​ - 全局过滤器,应用于所有路由

常用过滤器配置:

  1. ​StripPrefix​​ - 去除路径前缀

    filters:- StripPrefix=1           # 去除路径中的第一层前缀

    例如,请求 /api/service1/test,配置 StripPrefix=1 后,转发路径为 /service1/test

  2. ​RewritePath​​ - 重写路径

    filters:- RewritePath=/api/(?<segment>.*), /$\{segment}  # 将 /api/xxx 重写为 /xxx
  3. ​AddRequestHeader​​ - 添加请求头

    filters:- AddRequestHeader=X-Request-Foo, Bar  # 添加请求头 X-Request-Foo: Bar
  4. ​AddResponseHeader​​ - 添加响应头

    filters:- AddResponseHeader=X-Response-Foo, Bar  # 添加响应头 X-Response-Foo: Bar
  5. ​PrefixPath​​ - 添加路径前缀

    filters:- PrefixPath=/mypath  # 为所有请求路径添加前缀 /mypath
  6. ​RequestRateLimiter​​ - 请求限流

    filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10   # 每秒允许的请求数redis-rate-limiter.burstCapacity: 20   # 每秒最大允许的请求数key-resolver: "#{@userKeyResolver}"    # 限流键解析器
2.4 服务发现与负载均衡

当与 Spring Cloud DiscoveryClient (如 Eureka、Nacos) 集成时,可以使用服务发现功能:

spring:cloud:gateway:routes:- id: service_routeuri: lb://SERVICE-NAME       # lb 表示负载均衡,SERVICE-NAME 是注册的服务名predicates:- Path=/service/**filters:- StripPrefix=1
  • ​lb://SERVICE-NAME​​:使用负载均衡器将请求转发到名为 SERVICE-NAME 的服务实例
  • ​discovery.locator.enabled=true​​:启用服务发现定位器,允许通过服务名动态路由

3. 完整配置示例

下面是一个综合性的配置示例,展示多种配置组合:

spring:cloud:gateway:# 启用服务发现discovery:locator:enabled: true           # 启用服务发现lower-case-service-id: true  # 服务ID使用小写# 全局CORS配置globalcors:cors-configurations:'[/**]':allowedOrigins: "*"   # 允许所有源allowedMethods: "*"   # 允许所有HTTP方法allowedHeaders: "*"   # 允许所有请求头# 路由配置routes:# 路由1:静态路径路由- id: order_service_routeuri: lb://order-service  # 使用负载均衡转发到order-servicepredicates:- Path=/api/order/**   # 匹配以/api/order/开头的路径filters:- StripPrefix=2        # 去除前两级路径,如/api/order/ → /- AddRequestHeader=X-Gateway-Header, GatewayValue  # 添加请求头# 路由2:基于Header的路由- id: version_routeuri: lb://user-servicepredicates:- Path=/api/user/**- Header=X-API-Version, v1  # 仅当请求头X-API-Version为v1时匹配filters:- RewritePath=/api/user/(?<segment>.*), /v1/$\{segment}  # 重写路径# 路由3:基于查询参数的路由- id: query_routeuri: http://example.compredicates:- Path=/query/**- Query=token, \d+  # 必须包含token参数且为数字filters:- StripPrefix=1# 路由4:自定义白名单路由(不需要认证)- id: whitelist_routeuri: http://backend-servicepredicates:- Path=/auth/login, /auth/register, /public/**filters:- StripPrefix=1# 自定义白名单配置(可选,通过代码实现)
ignore:whites:- /auth/login- /auth/register- /**/v2/api-docs- /public/**

4. 通过代码配置路由

除了通过 YML 文件配置路由,还可以通过 Java 代码配置,提供更高的灵活性:

@Configuration
public class GatewayConfig {@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route("path_route", r -> r.path("/get").uri("http://httpbin.org")).route("host_route", r -> r.host("*.myhost.org").uri("http://httpbin.org")).route("rewrite_route", r -> r.host("*.rewrite.org").filters(f -> f.rewritePath("/foo/(?<segment>.*)", "/${segment}")).uri("http://httpbin.org")).route("hystrix_route", r -> r.path("/hystrix").filters(f -> f.hystrix(config -> config.setName("mycmd").setFallbackUri("forward:/fallback"))).uri("http://httpbin.org")).route("custom_filter_route", r -> r.path("/api/test/**").filters(f -> f.rewritePath("/api/test/(?<segment>.*)", "/${segment}").filter(new CustomFilter())).uri("lb://project-test")).build();}// 自定义过滤器示例@Componentpublic static class CustomFilter implements GatewayFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 自定义过滤逻辑System.out.println("Custom Filter executed");return chain.filter(exchange);}}
}

五、高级配置与功能

1. 负载均衡

通过使用 lb://SERVICE-NAME 格式的 URI,Spring Cloud Gateway 可以与服务发现组件(如 Eureka、Nacos)集成,实现负载均衡:

spring:cloud:gateway:routes:- id: service_routeuri: lb://SERVICE-NAMEpredicates:- Path=/service/**

确保在项目中集成了服务发现客户端,如 Eureka 或 Nacos。

2. 全局过滤器

全局过滤器应用于所有路由,常用于实现全局性的功能,如鉴权、日志记录等。创建一个全局过滤器:

@Component
public class CustomGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 在请求处理前执行的逻辑System.out.println("Global Pre Filter executed");return chain.filter(exchange).then(Mono.fromRunnable(() -> {// 在请求处理后执行的逻辑System.out.println("Global Post Filter executed");}));}@Overridepublic int getOrder() {return -1; // 过滤器的执行顺序,数值越小优先级越高}
}

3. 限流

使用 RequestRateLimiter 过滤器实现请求限流,通常与 Redis 配合使用:

spring:cloud:gateway:routes:- id: rate_limit_routeuri: http://example.compredicates:- Path=/rate-limit/**filters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 10     # 每秒允许的请求数redis-rate-limiter.burstCapacity: 20     # 每秒最大允许的请求数key-resolver: "#{@userKeyResolver}"      # 限流键解析器,需在代码中定义

需要在代码中定义 key-resolver Bean,例如基于用户 ID 限流:

@Bean
KeyResolver userKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("user"));
}

4. 熔断与重试

结合 Resilience4j 或 Hystrix 实现熔断和重试机制:

spring:cloud:gateway:routes:- id: circuit_breaker_routeuri: http://example.compredicates:- Path=/circuit-breaker/**filters:- name: CircuitBreakerargs:name: myCircuitBreakerfallbackUri: forward:/fallback

六、日志监控与运维

1. 日志功能

Spring Cloud Gateway 提供了丰富的日志功能,可以记录请求和响应的详细信息,帮助进行故障排查和性能优化:

  • ​控制台日志​​:默认情况下,网关会将请求和响应信息输出到应用日志中
  • ​文件日志​​:配置日志框架(如 Logback、Log4j2)将日志输出到文件
  • ​集成 ELK​​:将日志发送到 Elasticsearch、Logstash 和 Kibana 进行集中管理和分析

2. 监控工具

使用监控工具对网关的性能和流量进行实时监控和统计:

  • ​Spring Boot Actuator​​:提供健康检查、指标监控等功能
  • ​Prometheus + Grafana​​:集成 Prometheus 收集指标,使用 Grafana 进行可视化展示
  • ​Micrometer​​:与应用性能监控系统(如 Atlas、Datadog、New Relic)集成

七、最佳实践与常见问题

1. 最佳实践

  1. ​合理设计路由规则​​:根据业务需求设计清晰、简洁的路由规则,避免过于复杂的断言组合
  2. ​使用服务发现​​:与注册中心集成,实现动态路由和负载均衡,提高系统的弹性和可扩展性
  3. ​实施安全策略​​:通过过滤器实现鉴权、防止 SQL 注入、XSS 等安全措施
  4. ​监控与日志​​:实施全面的日志记录和监控,及时发现和解决问题
  5. ​性能优化​​:利用缓存、限流和熔断机制,保障网关的高可用性和高性能

2. 常见问题

  1. ​路由不生效​​:检查路由的 predicates 是否正确匹配请求,确保 id 唯一,配置无误
  2. ​性能瓶颈​​:合理配置线程池和连接数,使用异步非阻塞模型,避免阻塞操作
  3. ​服务不可用​​:确保后端服务正常运行,与注册中心集成正确,负载均衡策略合适
  4. ​跨域问题​​:通过 globalcors 配置正确处理跨域请求,或通过过滤器自定义跨域策略

八、总结

Spring Cloud Gateway 作为微服务架构中的重要组件,提供了强大而灵活的路由与过滤功能。通过本教程,您应该已经了解了如何集成 Spring Cloud Gateway、如何配置路由规则以及如何利用其丰富的功能来满足各种业务需求。

YML 配置文件是配置 Spring Cloud Gateway 路由的主要方式,通过合理配置 routespredicatesfilters,可以实现复杂的路由逻辑和请求处理。同时,结合服务发现、负载均衡、限流、熔断等高级功能,可以构建高可用、高性能的微服务网关。

在实际项目中,建议根据具体业务需求,结合 Spring Cloud Gateway 的扩展能力,定制适合的路由与过滤策略,并通过监控与日志功能,确保网关的稳定运行与高效性能。

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

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

相关文章

防火墙 只允许信任的几台服务器访问

1. 首先&#xff0c;确保 firewalld 服务正在运行&#xff1a;systemctl start firewalld systemctl enable firewall2. 设置默认拒绝规则&#xff1a;设置默认拒绝所有流量&#xff08;拒绝所有的入站流量&#xff09;&#xff1a;firewall-cmd --zonepublic --add-rejectal…

十三,数据结构-树

定义树也是基于节点的数据结构&#xff0c;和链表不同的是&#xff0c;树的节点可以指向多个节点。首先对树的一些常用术语进行说明&#xff1a;最上面的节点叫做根节点&#xff0c;根位于树顶&#xff0c;如图中的节点A&#xff1b;和族谱一样&#xff0c;节点有后代和祖先&am…

JVM-默背版

1.JVM对sychronized的优化&#xff1a;锁膨胀、锁消除、锁粗化、自适应自旋锁 &#xff08;1&#xff09;锁膨胀&#xff1a;从无锁、偏向锁、轻量级锁、重量级锁的过程叫做锁膨胀。在JDK1.6以前&#xff0c;sychronized是由重量级锁实现的&#xff0c;加锁和解锁的过程需要从用…

Mac M 系列芯片 YOLOv8 部署教程(CPU/Metal 后端一键安装)

在 Mac M 系列芯片&#xff08;Apple Silicon/ARM 架构&#xff09;上部署 YOLOv8&#xff0c;有一些注意事项&#xff1a;PyTorch 需要安装 ARM 原生版本&#xff0c;推理可利用 Metal 后端加速 CPU。本文教你一步步完成环境配置、模型下载、依赖安装和验证推理。1️⃣ 环境准…

Python爬虫实战:研究Units模块,构建气象数据采集和分析系统

1. 引言 1.1 研究背景 随着信息技术的飞速发展,互联网已成为全球最大的信息库,涵盖气象、金融、医疗、农业等多个领域的海量数据。这些数据蕴含着巨大的潜在价值,如何有效获取并深入分析这些数据成为当下研究的热点。Python 作为一种功能强大的编程语言,凭借其丰富的库资…

网页设计模板 HTML源码网站模板下载

互联网已成为现代社会不可或缺的一部分&#xff0c;网站则是连接线上与线下世界的桥梁。无论是用于展示个人作品集、推广商业产品还是提供公共服务信息&#xff0c;一个设计精良且功能完善的网站都能发挥巨大作用。然而&#xff0c;传统的手工编码方式不仅耗时费力&#xff0c;…

Flink KeyedProcessFunction为什么能为每个key定义State和Timer?

问题描述 一个常见的开窗逻辑&#xff08;12H 或者 500条&#xff09;&#xff1a; import org.apache.flink.api.common.state.ValueState; import org.apache.flink.api.common.state.ValueStateDescriptor; import org.apache.flink.api.common.typeinfo.Types; import or…

【C++】模版初阶---函数模版、类模版

&#x1f31f;个人主页&#xff1a;第七序章 &#x1f308;专栏系列&#xff1a;C&#xff0b;&#xff0b; 目录 ❄️前言&#xff1a; &#x1f308;1.泛型编程&#xff1a; &#x1f308;2.函数模板 &#x1f36d;2.1函数模板概念 &#x1f36d;2.2函数模板格式 &am…

查找算法(Java)

目录 一.定义 二.分类 三.线性查找 原理&#xff1a; 思路分析 代码实现 例题实践 1.两数之和 方法一&#xff1a;暴力穷举法 思路分析 代码实现 方法二&#xff1a;创建哈希表 思路分析 代码实现 2.移动零 思路分析 代码实现 四.二分查找 原理&#xff1a; …

计算机网络--四层模型,IP地址和MAC地址

四层模型&#xff1a;分别是应用层&#xff0c;传输层&#xff0c;网络层和链路层。应用层&#xff1a;提供了应用程序之间相互通信的接口&#xff0c;允许用户访问网络服务。这一层定义了应用程序如何与底层网络进行交互。例如HTTP协议。传输层&#xff1a;它处理数据的分段、…

解析、创建Excel文件的开源库OpenXLSX介绍

OpenXLSX是一个C库&#xff0c;用于读取、写入、创建和修改.xlsx格式的Microsoft Excel文件&#xff0c;源码地址&#xff1a;https://github.com/troldal/OpenXLSX &#xff0c;License为BSD-3-Clause&#xff0c;可在Windows、Linux、MaCOS平台上使用。最新发布版本为v0.3.2&…

【C++】C++11 篇二

【C】C11 篇二前言移动构造函数移动赋值运算符重载类成员变量初始化 &#xff08;缺省值出自C11强制生成默认函数的关键字default:禁止生成默认函数的关键字delete:继承和多态中的final与override关键字&#xff08;出自C11可变参数模板递归函数方式展开参数包逗号表达式展开参…

构建Python环境的几种工具

本文主要介绍如何构建Python环境来处理不同的工作。 1.常用的构建Python环境的工具 ①venv(内置模块):Python 3.3 内置标准库模块&#xff0c;无需额外安装。 ②virtualenv:venv的前身&#xff0c;功能更强大且支持旧版Python。 ③conda:来自 Anaconda 或 Miniconda。不仅能…

c#项目编译时外部依赖文件的同步问题

很多场景因为资源文件太多或太大无法放到资源里面或者是依赖的dll文件&#xff0c;需要编译时同步到bin\debug或bin\release下的&#xff0c;这里面要修改工程文件代码实现。 比如&#xff0c;我把这个项目依赖的dll和附加文件放到ref_dll文件夹里面&#xff0c;希望编译的时候…

数学建模常用算法-模拟退火算法

一、模拟退火算法模拟退火的灵感来源于物理中的 “退火过程”—— 将金属加热到高温后&#xff0c;缓慢冷却&#xff0c;金属原子会在热能作用下自由运动&#xff0c;逐渐形成能量最低的稳定结构。算法将这一过程抽象为数学模型&#xff1a;“温度 T”&#xff1a;对应物理中的…

架构很简单:业务架构图

缘起业务架构是一个复杂的体系&#xff0c;如何更简单的表达&#xff0c;并能使用起来呢&#xff1f;所谓&#xff1a;大道至简。基于此&#xff0c;这篇文章就开始了。业务是一切架构的开始&#xff0c;如果没有业务&#xff0c;架构又有什么作用呢&#xff1f;所以做架构首先…

【前端埋点】纯前端实现 A/B Test

“纯前端实现 A/B Test”&#xff0c;意思就是 没有后端分流、也不依赖流量网关&#xff0c;那么只能靠前端逻辑来做“流量切分”。 &#x1f3af; 目标 80% 的用户 → A 页面20% 的用户 → B 页面且要保证 同一个用户每次访问结果一致&#xff08;否则用户刷新页面时 A/B 会跳…

Day22_【机器学习—集成学习(3)—Boosting—Adaboost算法】

Adaptive Boosting(自适应提升)是基于 Boosting思想实现的一种集成学习算法&#xff0c;核心思想是通过逐步提高那些被前一步分类错误的样本的权重来训练一个强分类器。一、Adaboost算法直线相当于一个弱学习器&#xff0c;正确的数据权重减小&#xff0c;错误的数据权重增加二…

C#语言入门详解(18)传值、输出、引用、数组、具名、可选参数、扩展方法

C#语言入门详解&#xff08;18&#xff09;传值、输出、引用、数组、具名、可选参数、扩展方法一、传值参数1. 值类型2. 引用类型&#xff0c;并且创建对象3. 引用类型&#xff0c;不创建对象二、引用参数1. 值类型2. 引用类型&#xff0c;创建新对象3. 引用类型&#xff0c;不…

模型部署:(二)安卓端部署Yolov5-v6.0目标检测项目全流程记录

模型部署&#xff1a;&#xff08;二&#xff09;安卓端部署Yolov5-v6.0目标检测项目全流程记录1、下载NCNN项目2、下载基于安卓的yolov5项目3、修改相应的配置文件4、将项目打包成apk包5、部署自己训练的yolov5模型6、相关资料下载&#xff1a;1、下载NCNN项目 # 链接地址 ht…