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-Filter | GatewayFilter#filter | 在 下游调用前 执行:鉴权、限流、日志、加头。 |
⑤ 代理请求 | NettyRoutingFilter | 使用 Netty 客户端发送 HTTP/HTTPS 请求到下游。 |
⑥ Post-Filter | GatewayFilter#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 是构建健壮、可扩展、易管理的微服务系统的理想选择。