详细介绍: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 的实例。你可以在请求被路由之前之后,使用过滤器修改请求和响应。

工作流

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

通过yml配置使用

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> 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。

  • AfterBeforeBetween:基于时间段的匹配。

常用过滤器工厂

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

  • 请求操作:

    • AddRequestHeader:添加请求头。

    • AddRequestParameter:添加请求参数。

    • RewritePath:重写请求路径。

    • StripPrefix:跳过路径前缀。

  • 响应操作:

    • AddResponseHeader:添加响应头。

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

  • 高级功能:

    • RequestRateLimiter:限流。

    • Hystrix / CircuitBreaker:熔断器。

    • Retry:重试机制。

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

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

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

posted @ 2025-12-21 13:31  yangykaifa  阅读(4)  评论(0)    收藏  举报