ITPub博客

首页 > 应用开发 > IT综合 > Spring Cloud Gateway深度解析:路由配置、过滤机制与限流实践

Spring Cloud Gateway深度解析:路由配置、过滤机制与限流实践

IT综合 作者:bhluo 时间:2026-02-05 14:05:56 0 删除 编辑

# Spring Cloud Gateway深度解析:路由配置、过滤机制与限流实践


在现代微服务架构中,API网关作为系统入口,承担着路由转发、安全防护、流量治理等关键职责。Spring Cloud Gateway基于响应式编程模型,提供了灵活的路由配置和强大的过滤链机制,成为构建高效API网关的主流选择。


## 核心架构与工作流程


Spring Cloud Gateway基于Project Reactor和WebFlux构建,采用非阻塞异步模型。其核心组件包括路由定位器(RouteLocator)、路由处理器(HandlerMapping)和过滤器链(Filter Chain),共同构成了请求处理流水线。


```yaml

# application.yml 基础路由配置示例

spring:

  cloud:

    gateway:

      routes:

        - id: user_service_route

          uri: lb://user-service

          predicates:

            - Path=/api/users/**

          filters:

            - StripPrefix=1

            - name: RequestRateLimiter

              args:

                redis-rate-limiter.replenishRate: 10

                redis-rate-limiter.burstCapacity: 20

        - id: order_service_route

          uri: lb://order-service

          predicates:

            - Method=GET,POST

            - Header=X-Request-Id, \d+

          filters:

            - AddRequestHeader=X-Gateway-Request, true

```


## 路由配置模式详解


路由配置支持多种匹配条件和动态规则,满足不同场景需求。


```java

// 编程式路由配置

@Bean

public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {

    return builder.routes()

        .route("dynamic_route", r -> r

            .path("/api/**")

            .and()

            .query("version", "v2")

            .filters(f -> f

                .rewritePath("/api/(?<segment>.*)", "/${segment}")

                .addResponseHeader("X-Response-Time", Instant.now().toString())

                .circuitBreaker(config -> config

                    .setName("userCircuitBreaker")

                    .setFallbackUri("forward:/fallback/user"))

            )

            .uri("lb://backend-service"))

        .route("websocket_route", r -> r

            .path("/ws/**")

            .uri("ws://websocket-service:8080"))

        .build();

}


// 动态路由更新

@RefreshScope

@Configuration

public class DynamicRouteConfiguration {

    

    @Autowired

    private RouteDefinitionWriter routeDefinitionWriter;

    

    public void updateRoute(String routeId, RouteDefinition definition) {

        // 删除旧路由

        routeDefinitionWriter.delete(Mono.just(routeId)).subscribe();

        

        // 添加新路由

        routeDefinitionWriter.save(Mono.just(definition)).subscribe();

    }

}

```


## 过滤器链深度实践


过滤器提供请求处理过程中的横切关注点能力,支持全局过滤和路由级过滤。


```java

// 自定义全局过滤器

@Component

@Order(-1)

public class AuthenticationFilter implements GlobalFilter {

    

    private static final Logger logger = LoggerFactory.getLogger(AuthenticationFilter.class);

    

    @Override

    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        ServerHttpRequest request = exchange.getRequest();

        String authHeader = request.getHeaders().getFirst("Authorization");

        

        // JWT令牌验证

        if (authHeader != null && authHeader.startsWith("Bearer ")) {

            String token = authHeader.substring(7);

            if (validateToken(token)) {

                // 添加用户信息到请求头

                ServerHttpRequest modifiedRequest = request.mutate()

                    .header("X-User-Id", extractUserId(token))

                    .header("X-User-Roles", extractUserRoles(token))

                    .build();

                return chain.filter(exchange.mutate().request(modifiedRequest).build());

            }

        }

        

        // 未授权访问

        return unauthorizedResponse(exchange);

    }

    

    private boolean validateToken(String token) {

        // 实现令牌验证逻辑

        return !token.isEmpty();

    }

}


// 自定义网关过滤器工厂

@Component

public class RequestLoggingGatewayFilterFactory extends 

    AbstractGatewayFilterFactory<RequestLoggingGatewayFilterFactory.Config> {

    

    public RequestLoggingGatewayFilterFactory() {

        super(Config.class);

    }

    

    @Override

    public GatewayFilter apply(Config config) {

        return (exchange, chain) -> {

            ServerHttpRequest request = exchange.getRequest();

            long startTime = System.currentTimeMillis();

            

            // 记录请求信息

            logger.info("请求开始: {} {}, 参数: {}", 

                request.getMethod(), 

                request.getURI().getPath(),

                request.getQueryParams());

            

            return chain.filter(exchange).then(Mono.fromRunnable(() -> {

                long duration = System.currentTimeMillis() - startTime;

                ServerHttpResponse response = exchange.getResponse();

                

                logger.info("请求完成: 状态码={}, 耗时={}ms", 

                    response.getStatusCode(), 

                    duration);

                

                // 添加响应头

                exchange.getResponse().getHeaders()

                    .add("X-Request-Duration", String.valueOf(duration));

            }));

        };

    }

    

    public static class Config {

        private boolean logHeaders = false;

        

        public boolean isLogHeaders() { return logHeaders; }

        public void setLogHeaders(boolean logHeaders) { this.logHeaders = logHeaders; }

    }

}

```


## 限流熔断机制实现


限流和熔断是保障系统稳定的关键机制,Spring Cloud Gateway提供多种实现方案。


```java

// 基于Redis的分布式限流配置

@Configuration

public class RateLimiterConfiguration {

    

    @Bean

    public RedisRateLimiter redisRateLimiter() {

        // 令牌桶配置:每秒10个令牌,桶容量20

        return new RedisRateLimiter(10, 20);

<"wkm.s6k3.org.cn"><"sdn.s6k3.org.cn"><"djh.s6k3.org.cn">

    }

    

    @Bean

    public KeyResolver userKeyResolver() {

        // 按用户限流

        return exchange -> {

            String userId = exchange.getRequest()

                .getHeaders()

                .getFirst("X-User-Id");

            return Mono.just(userId != null ? userId : "anonymous");

        };

    }

    

    @Bean

    public KeyResolver ipKeyResolver() {

        // 按IP地址限流

        return exchange -> Mono.just(

            exchange.getRequest()

                .getRemoteAddress()

                .getAddress()

                .getHostAddress()

        );

    }

}


// 熔断器配置

@Configuration

public class CircuitBreakerConfig {

    

    @Bean

    public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() {

        return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)

            .circuitBreakerConfig(CircuitBreakerConfig.custom()

                .slidingWindowType(COUNT_BASED)

                .slidingWindowSize(10)

                .failureRateThreshold(50.0f)

                .waitDurationInOpenState(Duration.ofSeconds(5))

                .permittedNumberOfCallsInHalfOpenState(3)

                .build())

            .timeLimiterConfig(TimeLimiterConfig.custom()

                .timeoutDuration(Duration.ofSeconds(3))

                .build())

            .build());

    }

}

```


## 高级路由策略


```java

// 权重路由配置

@Bean

public RouteLocator weightRouteLocator(RouteLocatorBuilder builder) {

    return builder.routes()

        .route("weight_route_v1", r -> r

            .weight("service-group", 8)

            .and()

            .path("/api/**")

            .filters(f -> f

                .addRequestHeader("X-API-Version", "v1")

                .rewritePath("/api/(?<segment>.*)", "/v1/${segment}"))

            .uri("lb://service-v1"))

        .route("weight_route_v2", r -> r

            .weight("service-group", 2)

            .and()

            .path("/api/**")

            .filters(f -> f

                .addRequestHeader("X-API-Version", "v2")

                .rewritePath("/api/(?<segment>.*)", "/v2/${segment}"))

            .uri("lb://service-v2"))

        .build();

}


// 基于请求内容的动态路由

@Component

public class ContentBasedRouter implements RoutePredicateFactory<ContentBasedRouter.Config> {

    

    @Override

    public Predicate<ServerWebExchange> apply(Config config) {

        return exchange -> {

            String contentType = exchange.getRequest()

                .getHeaders()

                .getFirst("Content-Type");

            

            // 根据内容类型路由到不同服务

            if ("application/json".equals(contentType)) {

                exchange.getAttributes().put("target-service", "json-processor");

                return true;

            } else if ("application/xml".equals(contentType)) {

                exchange.getAttributes().put("target-service", "xml-processor");

                return true;

            }

            return false;

        };

    }

    

    public static class Config {

        private String defaultService;

        // 配置属性

    }

}

```


## 监控与可观测性


```java

// 监控端点配置

@Configuration

public class MonitoringConfig {

    

    @Bean

    public MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {

        return registry -> registry.config()

            .commonTags("application", "api-gateway")

            .commonTags("region", System.getenv("REGION"));

    }

    

    @Bean

    public RouteMetricsFilter routeMetricsFilter(MeterRegistry registry) {

        return new RouteMetricsFilter(registry);

    }

}


// 请求追踪过滤器

@Component

public class TracingFilter implements GlobalFilter {

    

    @Override

    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

        String traceId = exchange.getRequest()

            .getHeaders()

            .getFirst("X-Trace-Id");

        

        if (traceId == null) {

            traceId = UUID.randomUUID().toString();

        }

        

        ServerHttpRequest mutatedRequest = exchange.getRequest().mutate()

            .header("X-Trace-Id", traceId)

            .build();

        

        // 记录到MDC用于日志追踪

        MDC.put("traceId", traceId);

        

        return chain.filter(exchange.mutate().request(mutatedRequest).build())

            .doFinally(signalType -> MDC.clear());

    }

}

```


## 安全防护配置


```java

@Configuration

@EnableWebFluxSecurity

public class SecurityConfig {

    

    @Bean

    public SecurityWebFilterChain securityFilterChain(ServerHttpSecurity http) {

        return http

            .csrf().disable()

            .authorizeExchange()

                .pathMatchers("/actuator/health").permitAll()

                .pathMatchers("/api/public/**").permitAll()

                .pathMatchers("/api/admin/**").hasRole("ADMIN")

                .anyExchange().authenticated()

            .and()

            .oauth2ResourceServer()

                .jwt()

                .jwtAuthenticationConverter(jwtAuthenticationConverter())

            .and()

            .addFilterBefore(corsFilter(), SecurityWebFiltersOrder.CORS)

            .build();

<"ovo.s6k3.org.cn"><"bvd.s6k3.org.cn"><"tab.s6k3.org.cn">

    }

    

    private CorsFilter corsFilter() {

        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();

        CorsConfiguration config = new CorsConfiguration();

        config.setAllowCredentials(true);

        config.addAllowedOriginPattern("*");

        config.addAllowedHeader("*");

        config.addAllowedMethod("*");

        config.addExposedHeader("X-Trace-Id");

        source.registerCorsConfiguration("/**", config);

        return new CorsFilter(source);

    }

}

```


## 性能优化建议


1. **连接池配置优化**:

```yaml

spring:

  cloud:

    gateway:

      httpclient:

        pool:

          max-connections: 1000

          max-idle-time: 60s

          max-life-time: 300s

```


2. **响应式线程池调优**:

```java

@Bean

public ReactorResourceFactory reactorResourceFactory() {

    ReactorResourceFactory factory = new ReactorResourceFactory();

    factory.setUseGlobalResources(false);

    factory.setLoopResources(LoopResources.create("gateway", 4, true));

    return factory;

}

```


3. **缓存策略配置**:

```java

@Bean

public CacheManager cacheManager() {

    return new ConcurrentMapCacheManager("routeCache", "rateLimitCache");

}

```


## 部署与运维实践


生产环境部署需要考虑高可用、配置管理和滚动更新等需求:


```yaml

# Kubernetes部署配置示例

apiVersion: apps/v1

kind: Deployment

metadata:

  name: api-gateway

spec:

  replicas: 3

  strategy:

    type: RollingUpdate

    rollingUpdate:

      maxSurge: 1

      maxUnavailable: 0

  template:

    spec:

      containers:

      - name: gateway

        image: api-gateway:latest

        env:

        - name: SPRING_PROFILES_ACTIVE

          value: "prod"

        resources:

          limits:

            memory: "1Gi"

            cpu: "500m"

          requests:

            memory: "512Mi"

            cpu: "250m"

        readinessProbe:

          httpGet:

            path: /actuator/health/readiness

            port: 8080

        livenessProbe:

          httpGet:

            path: /actuator/health/liveness

            port: 8080

```


## 总结


Spring Cloud Gateway作为响应式API网关,通过灵活的路由配置、强大的过滤器链和完善的限流熔断机制,为微服务架构提供了可靠入口。在实际应用中,需要结合具体业务场景,合理设计路由策略、安全防护和性能优化方案。


网关的设计应当遵循单一职责原则,避免业务逻辑过度侵入。同时,完善的监控体系和故障处理机制是保障网关稳定运行的关键。随着业务规模扩大,网关可能需要演进为多级网关架构,分别处理南北流量和东西流量,实现更精细化的流量治理。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19545/viewspace-3109998/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-11-01

  • 博文量
    895
  • 访问量
    934035