🌐 Spring Cloud Gateway 简介
一、概述
Spring Cloud Gateway 是 Spring 官方推出的第二代 API 网关组件(第一代是 Zuul),用于替代 Netflix Zuul。它基于 Project Reactor 和 WebFlux 构建,采用非阻塞 IO 模型,性能更高,适用于现代微服务架构中的统一入口管理。
✅ Spring Boot 2.0+ + Spring WebFlux + Project Reactor = 非阻塞式响应式编程模型
二、核心功能
功能 | 描述 |
---|---|
路由(Routing) | 根据请求路径、方法等条件将请求转发到对应的服务实例 |
断言(Predicates) | 判断请求是否符合路由规则(如 Path、Method、Header、Query 等) |
过滤器(Filters) | 对请求和响应进行处理(如鉴权、限流、日志记录等) |
服务发现集成 | 支持与 Eureka、Consul、Nacos 等注册中心结合,实现动态路由 |
熔断降级 | 可集成 Hystrix 或 Resilience4j 实现熔断机制 |
限流控制 | 可通过 Redis + RequestRateLimiter 实现分布式限流 |
三、核心概念
1. Route(路由)
- 包含:
- ID
- 目标 URI
- 一组断言(Predicates)
- 一组过滤器(Filters)
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/user/**
filters:
- StripPrefix=1
2. Predicate(断言)
- 决定请求是否匹配某个 Route。
- 常见类型:
类型 | 示例 | 说明 |
---|---|---|
Path | Path=/api/user/** | 匹配路径 |
Method | Method=GET | 匹配 HTTP 方法 |
Header | Header=X-Request-Id, \d+ | 匹配 Header 值 |
Query | Query=name, abc | 匹配查询参数 |
Host | Host=**.example.org | 匹配域名 |
Cookie | Cookie=username, abc | 匹配 Cookie 值 |
3. Filter(过滤器)
- 分为 GatewayFilter(作用于单个路由)和 GlobalFilter(全局生效)
常用内置 Filter:
名称 | 功能 |
---|---|
StripPrefix | 去除前缀,例如 /api/user/xxx → /xxx |
AddRequestHeader | 添加请求头 |
RewritePath | 重写路径 |
SetStatus | 设置返回状态码 |
RateLimiter | 限流控制(需配合 Redis) |
CircuitBreaker | 熔断机制(支持 Hystrix / Resilience4j) |
四、流程图
Client → [Spring Cloud Gateway] → [Load Balancer (Ribbon)] → [Microservice]
↑
↓
[Service Discovery (Eureka/Nacos)]
[Config Server (可选)]
[Redis for Rate Limiting]
[Monitoring & Tracing (Sleuth/Zipkin)]
五、配置方式
1. YAML 配置(推荐)
spring:
cloud:
gateway:
routes:
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/order/**
filters:
- StripPrefix=1
- AddRequestHeader=X-Token, abc123
2. Java Config 方式(代码中定义路由)
@Bean
public RouteLocator customRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route("product-service", r -> r.path("/api/product/**")
.filters(f -> f.stripPrefix(1))
.uri("lb://product-service"))
.build();
}
六、集成其他组件
1. 服务发现(Eureka / Nacos)
spring:
cloud:
gateway:
discovery:
locator:
enabled: true # 自动创建路由
lower-case-service-id: true
自动路由规则:/service-id/**
→ lb://service-id/**
2. 限流(Redis + RequestRateLimiter)
spring:
cloud:
gateway:
routes:
- id: rate-limit-route
uri: lb://user-service
predicates:
- Path=/api/user/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
key-resolver: "#{@userKeyResolver}"
需要自定义 KeyResolver
来决定按谁限流(如 IP、用户ID)
3. 熔断(Hystrix / Resilience4j)
filters:
- name: CircuitBreaker
args:
name: myCircuitBreaker
fallbackUri: forward:/fallback
配合 @EnableCircuitBreaker
使用。
七、Spring Cloud Gateway vs Zuul
特性 | Spring Cloud Gateway | Netflix Zuul |
---|---|---|
基于框架 | WebFlux + Reactor | Servlet 2.5(阻塞式) |
性能 | 更高(非阻塞) | 较低 |
开发模式 | 函数式路由 | 注解式拦截器 |
易用性 | 配置简洁,功能强大 | 复杂且不维护 |
社区支持 | Spring 官方持续更新 | 已停止更新 |
扩展性 | 支持自定义 Predicate / Filter | 可扩展但复杂 |
八、常见使用场景
场景 | 描述 |
---|---|
统一入口 | 所有外部请求都经过网关,屏蔽内部服务细节 |
路由分发 | 根据 URL 路径或 Header 将请求分发到不同服务 |
认证鉴权 | 在网关层做 Token 验证、权限校验 |
日志记录 | 统一记录请求日志、耗时等信息 |
限流降级 | 控制请求频率,防止系统雪崩 |
A/B 测试 | 通过路由规则实现灰度发布 |
跨域处理 | 统一设置 CORS 策略 |
九、优缺点
✅ 优点
- 基于非阻塞 I/O,性能优越
- 提供丰富的内置断言和过滤器
- 支持服务发现、限流、熔断等高级功能
- 配置简单,易于与 Spring 生态集成
- 社区活跃,文档丰富
❌ 缺点
- 学习成本较高,尤其对响应式编程不熟悉的开发者
- 对于复杂的业务逻辑,Filter 和 Predicate 的编写可能较复杂
- 不适合传统同步阻塞的业务场景
- 限流等功能依赖 Redis 等中间件,部署复杂度上升
十、建议
- 合理设计路由规则
- 路由不宜过多,避免复杂度过高
- 网关只负责基础治理
- 业务逻辑尽量下沉到各微服务,保持网关轻量
- 启用健康检查和监控
- 结合 Actuator、Prometheus、Zipkin 等工具
- 灰度发布策略
- 利用权重、Header 匹配实现灰度路由
- 安全防护
- 防止 SQL 注入、XSS、CSRF 等攻击
- 限流策略合理
- 针对客户端 IP、用户 ID 等维度设置合理的 QPS 上限