Spring Cloud Gateway的常见用法
29

Spring Cloud Gateway 是一个基于 Spring Boot 2.x 和 WebFlux 的 API 网关,用于微服务架构中的统一入口管理。主要功能涵盖路由、过滤、限流、熔断等。

有以下五点常用的用法:

一、核心路由功能

1. ​​基础路由配置​

application.yml 中定义路由规则,匹配请求路径并转发到目标服务:

spring:
  cloud:
    gateway:
      routes:
        - id: user-service
          uri: lb://USER-SERVICE  # lb:// 表示负载均衡
          predicates:
            - Path=/users/**      # 路径匹配
        - id: order-service
          uri: http://localhost:8082
          predicates:
            - Method=GET,POST      # 请求方法匹配
  • uri 支持直接 URL 或服务注册中心(如 Nacos、Eureka)的服务名(lb://服务名

​2. 动态路由

通过集成服务发现组件(如 Nacos),自动发现服务实例并负载均衡:

spring:
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true  # 启用服务发现
  nacos:
    server-addr: localhost:8848

路由配置中的 uri 使用 lb://服务名 即可动态路由

​3. 路径重写

使用 RewritePath 过滤器修改请求路径:

filters:
  - RewritePath=/old/(?<segment>.*), /new/$\{segment}
  • 例如,将 /old/user 重写为 /new/user

场景​​:客户端仍使用旧版路径(如 /v1/user/1),但后端服务已升级到新版路径(如 /v2/user/1)。
​配置​​:

spring:
  cloud:
    gateway:
      routes:
        - id: version_route
          uri: http://user-service
          predicates:
            - Path=/v1/user/**
          filters:
            - RewritePath=/v1(?<segment>/?.*), /v2/$\{segment} 

​效果​​:
/v1/user/1 → 重写为 /v2/user/1,兼容新旧版本接口。

二、过滤器(Filters)​

​1. 请求/响应头操作​

  • ​添加请求头​​:AddRequestHeader=X-Request-Source, Gateway

  • 删除请求头​​:RemoveRequestHeader=Cookie

  • ​添加响应头​​:AddResponseHeader=X-Response-Status, OK

​2. 路径处理​

  • ​去除前缀​​:StripPrefix=2(移除路径前两级)

  • ​重定向​​:RedirectTo=302, https://new-domain.com

3. 熔断与重试​

  • ​熔断器​​:集成 Resilience4j 或 Hystrix,服务不可用时转发到降级接口:

    filters:
      - name: CircuitBreaker
        args:
          name: myCircuit
          fallbackUri: forward:/fallback
  • ​重试机制​​:Retry=3(最多重试 3 次)

​​三、断言(Predicates)​

断言用于定义路由匹配条件,支持多种匹配规则:

  1. ​路径匹配(最常用)​​:Path=/api/**

  2. ​时间窗口​​:

    • After=2024-01-01T00:00:00+08:00(指定时间后生效)

    • Between=start_time, end_time(时间段内生效)

  3. ​请求属性匹配​​:

    • ​Header 匹配​​:Header=X-Request-Id, \d+(值需为数字)

    • ​Cookie 匹配​​:Cookie=sessionId, abc123

    • ​Query 参数​​:Query=name, john

  4. ​权重路由​​:

    predicates:
      - Weight=group-a, 80  # 80% 流量转发到 group-a

、高级特性

​1. 限流(Rate Limiting)​

基于 Redis 的令牌桶算法限制请求速率:

filters:
  - name: RequestRateLimiter
    args:
      redis-rate-limiter:
        replenishRate: 10   # 每秒生成 10 个令牌
        burstCapacity: 20   # 突发容量 20
  • 需引入 spring-boot-starter-data-redis-reactive 依赖

​2. 安全控制

  • ​JWT 鉴权​​:集成 Spring Security OAuth2 验证请求合法性

  • ​IP 白名单​​:RemoteAddr=192.168.1.1/24

​3. 全局过滤器​

​自定义全局逻辑(如日志、鉴权):

@Bean
public GlobalFilter customFilter() {
    return (exchange, chain) -> {
        // 预处理逻辑
        return chain.filter(exchange);
    };
}

五、动态路由配置​

除 YAML 外,还支持:

1. java 代码配置​

@Bean
public RouteLocator customRoutes(RouteLocatorBuilder builder) {
    return builder.routes()
        .route("user_route", r -> r.path("/user/**")
             .uri("lb://user-service"))
        .build();
}

2. Redis 动态存储​

将路由规则存储在 Redis,实现实时更新

Spring Cloud Gateway的常见用法
https://www.orioncoder.cn/archives/spring-cloud-gatewayde-chang-jian-yong-fa
作者
Orion
发布于
更新于
许可