Spring Cloud Gateway解析和用法

API 网关的核心功能

一个成熟的 API 网关通常提供以下核心功能:

  1. 动态路由:将请求路由到不同的后端服务,是网关最基本的功能。

  2. 认证授权:集中处理身份验证(如 JWT 校验)和权限控制,避免在每个微服务中重复实现。

  3. 限流熔断:限制来自某个用户或服务的请求数量,防止系统被冲垮;当后端服务故障时,快速失败(熔断),避免雪崩效应。

  4. 负载均衡:在多个服务实例间分发请求。

  5. 安全防护:防范 SQL 注入、XSS 等常见攻击,管理 SSL 终端。

  6. 日志与监控:集中收集请求日志和指标,便于问题排查和系统观测。

  7. 响应聚合:将调用多个微服务的结果聚合起来,返回给客户端,减少网络开销。

  8. 协议转换:在内部微服务协议和外部客户端协议之间进行转换。

Spring Cloud Gateway 详解

Spring Cloud Gateway 是 Spring Cloud 生态系统官方推出的第二代 API 网关,基于 Spring WebFlux(响应式编程模型)实现,性能比第一代的 Zuul 1.x 更高。

核心概念

Spring Cloud Gateway 的核心工作原理基于三个概念:路由断言过滤器

  1. 路由 :网关的基本构建块。它由一个 ID、一个目标 URI、一组断言 和一组过滤器组成。如果断言为真,则匹配该路由。

  2. 断言 :这是 Java 8 中的 Predicate。它用于匹配 HTTP 请求中的任何内容(例如 headers、参数、方法、路径等)。如果请求与所有断言匹配,则该路由被选中。

  3. 过滤器 :这是 GatewayFilter 的实例。你可以在请求被路由之前之后,使用过滤器修改请求和响应。

工作流

bash 复制代码
客户端请求 -> Gateway Handler Mapping -> 找到与断言匹配的路由 -> 发送到 Gateway Web Handler -> 经过"pre"过滤器链 -> 代理请求到后端服务 -> 经过"post"过滤器链 -> 返回响应给客户端

通过yml配置使用

bash 复制代码
spring:
  cloud:
    gateway:
      routes:
        # 路由1:基于路径的路由
        - id: user_service_route
          uri: http://localhost:8081 # 目标服务URI
          predicates:
            - Path=/user/**          # 断言:匹配以 /user 开头的路径
          filters:
            - StripPrefix=1          # 过滤器:去掉路径的第一部分(/user),再转发给后端

        # 路由2:基于服务发现的路由
        - id: order_service_route
          uri: lb://ORDER-SERVICE    # lb:// 表示从注册中心(如Eureka)获取服务实例并负载均衡
          predicates:
            - Path=/order/**
            - Method=GET,POST        # 断言:同时匹配请求方法
          filters:
            - name: RequestRateLimiter # 过滤器:限流
              args:
                redis-rate-limiter.replenishRate: 10 # 每秒允许的请求数
                redis-rate-limiter.burstCapacity: 20 # 令牌桶容量
                key-resolver: "#{@userKeyResolver}"  # 限流策略(按用户限流)

        # 路由3:集成Hystrix熔断
        - id: product_service_route
          uri: lb://PRODUCT-SERVICE
          predicates:
            - Path=/product/**
          filters:
            - name: Hystrix           # 断路器
              args:
                name: productFallback
                fallbackUri: forward:/fallback/product
            - AddRequestHeader=X-Request-Color, Blue # 添加请求头

# 熔断降级的Controller
@RestController
public class FallbackController {
    @GetMapping("/fallback/product")
    public Mono<Map<String, String>> productFallback() {
        return Mono.just(Map.of("message", "Product service is temporarily unavailable. Please try again later.", "status", "503"));
    }
}

常用断言工厂

Spring Cloud Gateway 内置了许多断言工厂,用于匹配不同的请求条件:

  • Path:请求路径匹配,支持 Ant 风格和正则表达式。

  • Method:请求方法匹配(GET, POST等)。

  • Header:检查请求头是否包含某个名称或符合某个正则。

  • Host:匹配请求的 Host 头。

  • Query:匹配请求参数。

  • Cookie:匹配 Cookie。

  • After, Before, Between:基于时间段的匹配。

常用过滤器工厂

过滤器用于修改请求和响应。分为 Pre 过滤器和 Post 过滤器。

  • 请求操作:

    • AddRequestHeader:添加请求头。

    • AddRequestParameter:添加请求参数。

    • RewritePath:重写请求路径。

    • StripPrefix:跳过路径前缀。

  • 响应操作:

    • AddResponseHeader:添加响应头。

    • DedupeResponseHeader:消除重复的响应头。

  • 高级功能:

    • RequestRateLimiter:限流。

    • Hystrix / CircuitBreaker:熔断器。

    • Retry:重试机制。

    • SaveSession:在转发前保存 WebSession(常用于 Spring Session)。

    • SecureHeaders:添加安全相关的头部。

自定义过滤器:

你可以实现 GatewayFilterFactory 接口来创建自定义过滤器,以满足特定业务逻辑。

相关推荐
AI大模型应用之禅18 分钟前
全球股市估值与可持续农业垂直种植技术的关系
网络·ai
掘根23 分钟前
【仿Muduo库项目】HTTP模块2——HttpRequest子模块,HttpResponse子模块
网络·网络协议·http
necessary6531 小时前
使用Clion查看linux环境中的PG源码
linux·运维·服务器
江湖有缘2 小时前
Jump个人仪表盘Docker化部署教程:从0到 搭建专属导航页
运维·docker·容器
FL16238631293 小时前
win11+WSL+Ubuntu-xrdp+远程桌面闪退+黑屏闪退解决
linux·运维·ubuntu
MOON404☾3 小时前
006.Backdoor后门编写
网络·安全·网络安全·系统安全
ha20428941943 小时前
Linux操作系统学习记录之---TcpSocket
linux·网络·c++·学习
AOwhisky3 小时前
Linux逻辑卷管理:从“固定隔间”到“弹性存储池”的智慧
linux·运维·服务器
05大叔4 小时前
大事件Day02
运维·服务器
李白你好4 小时前
Burp Suite插件 | 高级HTTP头操作工具
网络·网络协议·http