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):

yaml 复制代码
   spring:
      cloud:
        gateway:
          routes:
            - id: user_service_route       # 路由ID
              uri: 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. 执行流程

powershell 复制代码
┌────────────┐
│   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 是构建健壮、可扩展、易管理的微服务系统的理想选择。

相关推荐
乐观的Terry13 小时前
8、发布系统-完整流水线的核心
java·spring boot·spring·spring cloud
147API16 小时前
部署 Claude Apps Gateway,先把登录、策略和上游这条链跑通
gateway
深念Y17 小时前
CC Switch 显示错误模型名的排查与解决
网关·开源·agent·项目·代理
程序猿DD3 天前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
野蛮人6号4 天前
黑马天机学堂系列问题之域名无法正常使用
java·spring cloud·天机学堂
爱学习的小可爱卢4 天前
SpringCloud——微服务实战:OpenFeign与Nacos服务调用详解
spring·spring cloud·微服务
野蛮人6号5 天前
黑马天机学堂Day01-08.搭建项目环境-本地开发部署方式——不知道nacos的密码是什么
java·spring cloud·黑马程序员·天机学堂·黑马天机学堂
dyonggan5 天前
IDEA从零搭建SpringCloud Alibaba完整工程
java·spring cloud·intellij-idea
tryxr5 天前
Spring Cloud Gateway
java·开发语言·数据库·网关·spring cloud·gateway
码农学院6 天前
建筑机械行业AI搜索优化技术方案:基于Spring Cloud微服务架构的文件管理与智能化内容推荐系统
人工智能·spring cloud·架构