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 分钟前
Linux网络编程之listen函数:深入解析与应用实践
linux·服务器·开发语言·网络·c++·程序人生
百***78757 分钟前
Clawdbot 技术实战:基于一步 API 快速接入,打造本地化 AI 自动化助手
运维·人工智能·自动化
EnglishJun8 分钟前
数据结构的学习(二)---Makefile的使用
linux·运维·学习
物联网软硬件开发-轨物科技13 分钟前
【轨物方案】告别“盲维”时代:如何不动一根电线,帮老旧电站找回消失的 5% 收益?
服务器·网络·数据库
jl486382118 分钟前
打造医疗设备的“可靠视窗”:医用控温仪专用屏从抗菌设计到EMC兼容的全链路解析
大数据·运维·人工智能·物联网·人机交互
曾几何时`18 分钟前
Docker容器化部署编译运行模块
运维·docker·容器
HalvmånEver21 分钟前
Linux:线程 ID 与地址空间布局:深入理解线程内存分布(线程七)
linux·运维·服务器·操作系统·线程
以太浮标22 分钟前
华为eNSP模拟器综合实验之- NAT策略配置类型全景汇总
服务器·网络·华为
北京阿法龙科技有限公司26 分钟前
工业场景下AR+AI图像识别:精准选型赋能运维与质检
运维·人工智能·ar
小oo呆1 小时前
【学习心得】CMD终端设置Proxy的几个要点
运维·服务器·网络