Spring Cloud Gateway核心架构
Spring Cloud Gateway是基于Spring WebFlux构建的API网关,采用Reactor响应式编程模型,底层依赖Netty实现非阻塞IO。相比Zuul 1.x的阻塞模型,Spring Cloud Gateway在并发性能上有数量级提升。其核心组件包括Route(路由定义,包含ID、目标URI、Predicate和Filter)、Predicate(断言工厂,匹配HTTP请求)、Filter(过滤器,修改请求和响应)。Gateway通过RoutePredicateFactory和GatewayFilterFactory的SPI机制扩展功能,内置30+种断言和过滤器,覆盖路径匹配、Header修改、限流、熔断等常见场景。
动态路由配置与热更新
生产环境中路由规则需要动态调整而不重启网关,Spring Cloud Gateway支持通过自定义RouteDefinitionRepository实现路由的动态加载。以下是基于Redis的动态路由实现:
// DynamicRouteDefinitionRepository.java
public class DynamicRouteDefinitionRepository implements RouteDefinitionRepository {
private final StringRedisTemplate redisTemplate;
private final ObjectMapper objectMapper;
@Override
public Flux<RouteDefinition> getRouteDefinitions() {
Set<String> keys = redisTemplate.keys("gateway:routes:*");
if (keys == null || keys.isEmpty()) {
return Flux.empty();
}
List<RouteDefinition> routes = new ArrayList<>();
for (String key : keys) {
String json = redisTemplate.opsForValue().get(key);
try {
routes.add(objectMapper.readValue(json, RouteDefinition.class));
} catch (Exception e) {
log.error("Parse route definition failed: {}", key, e);
}
}
return Flux.fromIterable(routes);
}
@Override
public Mono<Void> save(Mono<RouteDefinition> route) {
return route.flatMap(r -> {
String json = objectMapper.writeValueAsString(r);
redisTemplate.opsForValue().set("gateway:routes:" + r.getId(), json);
applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this));
return Mono.empty();
});
}
@Override
public Mono<Void> delete(Mono<String> routeId) {
return routeId.flatMap(id -> {
redisTemplate.delete("gateway:routes:" + id);
applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this));
return Mono.empty();
});
}
}
路由信息存储在Redis中,通过ApplicationEventPublisher发布RefreshRoutesEvent触发路由表热更新,无需重启网关进程。
RequestRateLimiter限流过滤器配置
Spring Cloud Gateway内置RequestRateLimiter过滤器,基于Redis + Lua脚本实现令牌桶限流,支持按用户、IP、路径等多维度限流。配置示例:
spring:
cloud:
gateway:
routes:
- id: user-service
uri: lb://user-service
predicates:
- Path=/api/users/**
filters:
- name: RequestRateLimiter
args:
redis-rate-limiter.replenishRate: 100
redis-rate-limiter.burstCapacity: 200
key-resolver: "#{@userKeyResolver}"
- StripPrefix=1
replenishRate是令牌填充速率(每秒100个),burstCapacity是桶容量(突发200个)。key-resolver定义限流维度,以下是基于用户ID的KeyResolver:
@Bean
KeyResolver userKeyResolver() {
return exchange -> {
String userId = exchange.getRequest().getHeaders().getFirst("X-User-Id");
if (userId == null) {
userId = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
}
return Mono.just(userId);
};
}
按用户限流可防止单用户刷接口,按IP限流可防爬虫和DDoS,两者可组合使用。
Resilience4j熔断降级配置
Spring Cloud Gateway集成Resilience4j实现熔断和降级。配置CircuitBreaker过滤器:
spring:
cloud:
gateway:
routes:
- id: order-service
uri: lb://order-service
predicates:
- Path=/api/orders/**
filters:
- name: CircuitBreaker
args:
name: orderServiceCB
fallbackUri: forward:/fallback/orders
resilience4j:
circuitbreaker:
instances:
orderServiceCB:
sliding-window-size: 20
minimum-number-of-calls: 10
failure-rate-threshold: 50
wait-duration-in-open-state: 30s
permitted-number-of-calls-in-half-open-state: 5
sliding-window-type: COUNT_BASED
降级接口处理逻辑:
@RestController
public class FallbackController {
@GetMapping("/fallback/orders")
public Mono<ResponseEntity<Map<String, Object>>> orderFallback() {
Map<String, Object> body = Map.of(
"code", 503,
"message", "订单服务暂时不可用,请稍后重试"
);
return Mono.just(ResponseEntity.status(503).body(body));
}
}
熔断器在失败率达到50%时打开,30秒后进入半开状态探测,5个探测请求通过则关闭熔断器,否则继续保持打开。
网关性能调优与监控
Gateway基于WebFlux响应式模型,调优方向与传统Servlet容器不同。关键参数包括:reactor.netty.ioWorkerCount(IO线程数,默认CPU核心数*2)、spring.cloud.gateway.httpclient.connectTimeout、spring.cloud.gateway.httpclient.responseTimeout。监控方面通过Gateway内置的GlobalFilter记录请求指标,集成Micrometer+Prometheus暴露metrics端点,Grafana展示QPS、延迟分位数、错误率等核心指标。生产环境建议配合Nacos/Apollo做配置中心统一管理路由规则,实现多环境灰度发布。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/springcloudgateway-wang-guan-xian-liu-rong-duan-yu-dong-tai/