Spring Cloud Gateway 简介
Spring Cloud Gateway 是基于 Spring 5、Spring Boot 2 和 Project Reactor 的 API 网关,旨在提供简单、高效的方式路由到 API 并为其提供跨领域的关注点,如安全性、监控/指标和弹性。它使用非阻塞 API,支持 WebSocket,适合构建微服务架构中的边缘服务。
核心概念
路由(Route)
路由是网关的基本构建块,由 ID、目标 URI、断言集合和过滤器集合组成。如果断言为真,则匹配该路由。
断言(Predicate)
Java 8 的 Predicate,用于匹配 HTTP 请求中的任何内容(如请求头或参数)。
过滤器(Filter)
GatewayFilter 的实例,可以在请求或响应被处理前/后修改请求或响应。
主要特性
- 动态路由:支持运行时动态路由配置。
- 请求限流:集成 Resilience4j 或 Sentinel 实现限流。
- 路径重写:支持路径重写规则。
- 集成 Hystrix:提供熔断功能(Spring Cloud 2020.0 后默认移除,需手动配置)。
- 支持 WebSocket:完整支持 WebSocket 通信。
- 服务发现集成:与 Eureka、Consul、Nacos 等注册中心无缝集成。
基本配置示例
依赖配置
在 pom.xml 中添加以下依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
路由配置
通过 YAML 或 Java 代码配置路由。以下是 YAML 示例:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
filters:
- StripPrefix=1 # 移除路径前缀(如 /api)
动态路由
通过 RouteDefinitionLocator 或 RouteLocator 动态更新路由:
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("test_route", r -> r.path("/test/**")
.uri("http://example.com"))
.build();
}
断言类型
- Path 断言:匹配请求路径(如
/api/**)。 - Method 断言:匹配 HTTP 方法(如
GET、POST)。 - Header 断言:检查请求头(如
X-Request-Id)。 - Query 断言:匹配查询参数(如
?name=value)。 - Cookie 断言:检查 Cookie 值。
- Weight 断言:按权重分配流量。
示例配置:
predicates:
- Path=/api/**
- Method=GET
- Header=X-Request-Id, \d+
- Query=name, value
过滤器类型
全局过滤器(GlobalFilter)
作用于所有路由,如 LoadBalancerClientFilter(集成负载均衡)、NettyWriteResponseFilter(修改响应)。
局部过滤器(GatewayFilter)
仅作用于特定路由,例如:
AddRequestHeader:添加请求头。AddRequestParameter:添加请求参数。RewritePath:重写路径。Retry:配置重试逻辑。
示例配置:
filters:
- AddRequestHeader=X-Request-Color, Blue
- RewritePath=/api/(?<segment>.*), /$\{segment}
高级功能
限流配置
集成 Redis 实现令牌桶限流:
spring:
cloud:
gateway:
routes:
- id: limit_route
uri: http://example.com
predicates:
- Path=/limited/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 10 # 每秒允许的请求数
redis-rate-limiter.burstCapacity: 20 # 突发容量
熔断配置
结合 Resilience4j 实现熔断:
filters:
- name: CircuitBreaker
args:
name: myCircuitBreaker
fallbackUri: forward:/fallback
自定义过滤器
实现 GlobalFilter 接口:
@Component
public class LoggingFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("Request path: " + exchange.getRequest().getPath());
return chain.filter(exchange);
}
}
性能优化建议
- 启用响应式 Netty 服务器:默认使用 Netty,无需额外配置。
- 缓存路由定义:避免频繁解析路由规则。
- 合理配置线程池:调整
reactor-netty的线程数(如spring.netty.workerThreads)。 - 监控指标:通过 Actuator 暴露
/actuator/gateway端点监控路由状态。
常见问题
与 Zuul 的区别
Spring Cloud Gateway 基于非阻塞模型,性能优于 Zuul 1.x;Zuul 2.x 也支持非阻塞,但生态不如 Gateway。
如何集成服务发现
通过 lb://service-id 格式的 URI 自动从注册中心(如 Eureka)获取服务实例。
跨域支持
配置 spring.cloud.gateway.globalcors 启用全局 CORS:
spring:
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]':
allowedOrigins: "*"
allowedMethods: "*"
通过以上内容,可以快速掌握 Spring Cloud Gateway 的核心功能与配置方法。实际应用中需结合具体场景调整路由、过滤器和断言策略。
5413

被折叠的 条评论
为什么被折叠?



