在微服务架构中,API网关就像城市中的十字路口交警:既要确保流量畅通(路由转发),又要拦截可疑车辆(过滤器处理),还能在高峰期实施管制(限流熔断)。Spring Cloud Gateway正是这样一位"数字化交警",今天我们就通过实战来解锁它的三大核心能力。
一、基础建设:构建网关环境
(技术栈:Spring Cloud 2021.0.3 + Java 11)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
二、路由转发:给请求发放通行证
2.1 基于YAML的路由配置
spring:
cloud:
gateway:
routes:
- id: user_service_route
uri: lb://user-service # 服务发现动态路由
predicates:
- Path=/api/users/**
filters:
- StripPrefix=2 # 移除前两级路径
- id: fallback_route
uri: http://localhost:8080/fallback
predicates:
- Header=X-Request-Type, backup
2.2 Java DSL动态路由(适用于灰度发布)
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("payment_route", r -> r.path("/pay/**")
.filters(f -> f.addRequestHeader("X-Routing-Type", "priority"))
.uri("lb://payment-service"))
.route("legacy_route", r -> r.host("old.company.com")
.uri("http://legacy.server:8080"))
.build();
}
三、过滤器链:打造智能检查站
3.1 内置过滤器实战
filters:
- AddRequestHeader=X-Client-ID, 12345
- RewritePath=/v1/(?<segment>.*), /$\{segment}
- ModifyRequestBody=User, User # 使用JSON转换过滤器
3.2 自定义过滤器(实现IP白名单)
@Component
public class IPWhitelistFilter implements GlobalFilter {
private Set<String> whitelist = Set.of("192.168.1.0/24");
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String ip = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
if(!isAllowed(ip)) {
exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
private boolean isAllowed(String ip) {
// 实现CIDR校验逻辑
}
}
四、防御体系:熔断限流黄金组合
4.1 令牌桶限流(基于Redis)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis-reactive</artifactId>
</dependency>
spring:
redis:
host: localhost
cloud:
gateway:
routes:
- id: rate_limit_route
uri: lb://order-service
predicates:
- Path=/orders/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 50 # 每秒补充令牌数
redis-rate-limiter.burstCapacity: 100 # 突发容量
key-resolver: "#{@userKeyResolver}"
@Bean
KeyResolver userKeyResolver() {
return exchange -> Mono.just(
exchange.getRequest().getHeaders().getFirst("X-User-Id"));
}
4.2 熔断配置(集成Resilience4j)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
</dependency>
filters:
- name: CircuitBreaker
args:
name: inventoryCircuit
fallbackUri: forward:/fallback/inventory
statusCodes:
- 500
- 504
五、实践指南:你不知道的魔鬼细节
5.1 路由匹配优先级陷阱
路由配置的顺序直接影响匹配结果,采用"最长路径优先"原则。建议使用路由权重进行精确控制:
routes:
- id: specific_route
uri: lb://v2-service
predicates:
- Path=/api/v2/**
- Weight=group1, 90
- id: generic_route
uri: lb://v1-service
predicates:
- Path=/api/**
- Weight=group1, 10
5.2 过滤器执行顺序调试
通过Actuator端点查看过滤器链:
GET /actuator/gateway/globalfilters
GET /actuator/gateway/routefilters
六、技术雷达:核心能力深度剖析
应用场景全景
- 灰度发布系统:基于Header的路由分流
- 安全认证中心:JWT校验过滤器集群
- 流量管控平台:多维度限流策略组
- 异构系统桥梁:协议转换过滤器
性能优化要点
- 配置缓存优化:启用
spring.cloud.gateway.redis-rate-limiter.enableRateLimitResponseHeaders=false - Netty线程调优:调整
reactor-netty的worker线程数 - 响应式编程优化:避免在过滤器中阻塞调用
技术选型对比
| 维度 | Spring Cloud Gateway | Zuul 1.x | Nginx |
|---|---|---|---|
| 吞吐量 | 高(响应式) | 低(阻塞) | 极高 |
| 配置灵活性 | Java DSL + YAML | 注解驱动 | 配置文件 |
| 集成复杂度 | 低 | 中等 | 高(Lua脚本) |
| 可观测性 | Actuator + Micrometer | 有限 | 需单独配置 |
七、经验总结:从战场归来的启示
- 路由匹配:当使用多个predicate时,注意逻辑与(AND)的组合效果
- 过滤器顺序:修改请求参数的过滤器必须早于需要读取这些参数的过滤器
- 限流策略:结合Redis Cluster实现分布式限流场景
- 熔断监控:通过Micrometer对接Prometheus实现熔断器状态可视化
- 冷启动保护:在网关层实现动态预热权重调整
评论