Spring Cloud Gateway 是 Spring Cloud 生态系统中的官方 API 网关,基于 Spring WebFlux 和 Project Reactor 构建,专为微服务架构提供高性能、异步非阻塞的请求路由与过滤能力。以下从技术架构、核心特性、应用场景等方面详细解析:
一、核心概念与架构
1. 异步非阻塞模型
- 基于 Netty 服务器,支持 Reactor 响应式编程,单线程可处理大量并发连接。
- 相比传统 Servlet 容器(如 Tomcat),资源利用率更高,延迟更低。
2. 路由与过滤器链
- 路由(Route):由 ID、目标 URI、断言(Predicate)和过滤器(Filter)组成。
- 断言(Predicate):基于 HTTP 请求的属性(如路径、请求头、参数)匹配路由。
- 过滤器(Filter):修改请求或响应,分为全局过滤器和网关过滤器。
3. 集成 Spring Cloud
- 自动与 服务发现组件(Eureka、Nacos、Consul)集成,支持基于服务名的路由。
- 无缝整合 断路器(Resilience4j)、负载均衡(Spring Cloud LoadBalancer)。
二、核心组件与功能
1. 路由断言(Predicate)
- Path 断言:匹配请求路径,如:
Path=/api/users/**
- Method 断言:匹配 HTTP 方法,如:
Method=GET,POST
- Header/Query 断言:基于请求头或参数匹配,如:
Header=X-Request-Id, \d+
2. 过滤器(Filter)
- 内置过滤器:
filters: - AddRequestHeader=X-Request-Foo, Bar # 添加请求头 - RewritePath=/api/(?<segment>.*), /$\{segment} # 路径重写 - RequestRateLimiter=... # 限流过滤器
- 自定义全局过滤器:
@Component public class LoggingFilter implements GlobalFilter, Ordered { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { log.info("Request path: {}", exchange.getRequest().getPath()); return chain.filter(exchange); } @Override public int getOrder() { return -1; } }
3. 服务发现路由
- 通过
lb://
前缀启用基于服务发现的负载均衡:routes: - id: user-service uri: lb://user-service # 自动从注册中心获取实例 predicates: - Path=/api/users/**
三、关键特性
1. 响应式编程支持
- 使用
Mono
和Flux
处理异步请求,示例:@Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { return builder.routes() .route("user-service", r -> r.path("/api/users/**") .filters(f -> f.stripPrefix(1)) .uri("lb://user-service")) .build(); }
2. 限流与熔断
- 基于 Redis 的令牌桶限流:
spring: cloud: gateway: routes: - id: rate_limit_route uri: lb://backend-service predicates: - Path=/api/books/** filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 10 # 每秒补充令牌数 redis-rate-limiter.burstCapacity: 20 # 令牌桶容量 key-resolver: "#{@userKeyResolver}" # 自定义限流键
- 集成 Resilience4j 熔断:
- name: CircuitBreaker args: name: myCircuitBreaker fallbackUri: forward:/fallback
3. WebSocket 支持
- 直接代理 WebSocket 连接:
routes: - id: websocket_route uri: lb:ws://websocket-service predicates: - Path=/ws/**
四、配置方式
1. YAML 配置(声明式)
spring:
cloud:
gateway:
routes:
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/orders/**
filters:
- AddRequestHeader=X-Request-From, Gateway
- Retry=3 # 请求重试
2. Java 配置(编程式)
@Bean
public RouteLocator customRoutes(RouteLocatorBuilder builder) {
return builder.routes()
.route("product-service", r -> r
.path("/api/products/**")
.and().method(HttpMethod.GET)
.filters(f -> f
.circuitBreaker(c -> c.setName("productCircuitBreaker"))
.retry(retry -> retry.setRetries(3)))
.uri("lb://product-service"))
.build();
}
五、与 Zuul 的对比
特性 | Spring Cloud Gateway | Netflix Zuul 1.x |
---|---|---|
编程模型 | 异步非阻塞(Reactor) | 同步阻塞(Servlet API) |
吞吐量 | 高(单线程处理大量连接) | 低(依赖线程池大小) |
过滤器机制 | 基于 WebFilter 接口 | 基于 Java 类继承 |
服务发现集成 | 自动集成 Spring Cloud LoadBalancer | 依赖 Ribbon |
限流熔断 | 集成 Resilience4j | 依赖 Hystrix |
WebSocket 支持 | 原生支持 | 需要额外配置 |
六、适用场景
- 高并发微服务架构:充分利用异步特性,降低资源消耗。
- 响应式应用:与 Spring WebFlux 服务无缝集成。
- 云原生场景:适配 Kubernetes、Service Mesh 等环境。
- API 网关统一入口:集中处理认证、限流、监控等横切关注点。
七、常见扩展
1. 自定义过滤器
@Component
public class AuthFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getHeaders().getFirst("Authorization");
if (token == null || !validateToken(token)) {
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() { return 0; }
}
2. 集成 OAuth2 认证
spring:
security:
oauth2:
client:
registration:
auth-server:
provider: spring
client-id: gateway-client
client-secret: secret
authorization-grant-type: authorization_code
redirect-uri: "{baseUrl}/login/oauth2/code/{registrationId}"
八、性能优化建议
-
调整 Netty 配置:
spring: cloud: gateway: httpclient: wiretap: true # 启用网络日志 pool: type: elastic # 弹性连接池 max-idle-time: 30000 # 连接最大空闲时间(毫秒)
-
使用缓存:对静态资源或频繁访问的数据添加缓存过滤器。
-
合理配置线程池:
spring: cloud: gateway: thread-pool: core-size: 10 # 核心线程数 max-size: 100 # 最大线程数
九、总结
Spring Cloud Gateway 是现代微服务架构的首选 API 网关,通过异步非阻塞模型提供更高性能,同时保持与 Spring Cloud 生态的深度集成。其灵活的路由配置、丰富的过滤器和响应式编程模型,使其成为构建高并发、弹性系统的理想选择。