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)
断言用于定义路由匹配条件,支持多种匹配规则:
路径匹配(最常用):
Path=/api/**
时间窗口:
After=2024-01-01T00:00:00+08:00
(指定时间后生效)Between=start_time, end_time
(时间段内生效)
请求属性匹配:
Header 匹配:
Header=X-Request-Id, \d+
(值需为数字)Cookie 匹配:
Cookie=sessionId, abc123
Query 参数:
Query=name, john
权重路由:
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,实现实时更新