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 接口来创建自定义过滤器,以满足特定业务逻辑。

相关推荐
拾忆,想起1 小时前
Dubbo超时问题排查与调优指南:从根因到解决方案
服务器·开发语言·网络·微服务·架构·php·dubbo
晨非辰2 小时前
数据结构排序系列指南:从O(n²)到O(n),计数排序如何实现线性时间复杂度
运维·数据结构·c++·人工智能·后端·深度学习·排序算法
RoboWizard3 小时前
高性能电脑热战寒冬 11月DIY配置推荐
linux·运维·服务器·电脑·金士顿
q***04053 小时前
Nginx 缓存清理
运维·nginx·缓存
小小测试开发7 小时前
JMeter JSR223预处理程序全攻略:用Groovy解锁复杂场景自动化
运维·jmeter·自动化
侯小啾9 小时前
理解计算机网络中的MAC地址
网络·计算机网络·macos·mac
甄心爱学习9 小时前
计算机网络12
运维·服务器·网络
moringlightyn9 小时前
Linux---进程状态
linux·运维·服务器·笔记·操作系统·c·进程状态
shizhan_cloud10 小时前
DNS 服务器
linux·运维