Spring Cloud Gateway应用场景

以下是基于Spring Cloud Gateway典型应用场景的整理及对应代码实现方案:

一、应用场景分类及代码实现清单

1. 路由控制场景
场景 技术要点 代码示例文件
路径重写路由 RewritePath过滤器 RewriteRouteConfig.java
权重路由 Weight计算策略 WeightRouteConfig.java
多版本路由 Header断言+元数据路由 CanaryReleaseConfig.java
2. 安全控制场景
场景 技术要点 代码示例文件
JWT认证 全局过滤器+JWT解析 JwtAuthFilter.java
IP黑白名单 自定义GlobalFilter IpWhitelistFilter.java
防重放攻击 Nonce校验+Redis存储 ReplayAttackFilter.java
3. 流量治理场景
场景 技术要点 代码示例文件
熔断降级 Hystrix/Resilience4j集成 CircuitBreakerConfig.java
限流控制 RedisRateLimiter RateLimiterConfig.java
请求镜像 Mirroring过滤器 TrafficMirrorConfig.java
4. 系统集成场景
场景 技术要点 代码示例文件
服务发现路由 LB集成+服务标识 DiscoveryRouteConfig.java
WebSocket代理 自定义协议处理 WebsocketRouteConfig.java
GraphQL路由 路径转换+内容协商 GraphqlRouteConfig.java

二、核心场景代码实现示例

1. 路径重写路由(RewriteRouteConfig.java)
@Configuration
public class RewriteRouteConfig {
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("resource_route", r -> r.path("/resource/v1/**")
                .filters(f -> f.rewritePath("/resource/v1/(?<segment>.*)", "/api/${segment}"))
                .uri("lb://resource-service"))
            .build();
    }
}
2. JWT认证(JwtAuthFilter.java)
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class JwtAuthFilter implements GlobalFilter {
    private final JwtParser jwtParser = Jwts.parserBuilder()
            .setSigningKey(Keys.hmacShaKeyFor("secret".getBytes()))
            .build();

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = exchange.getRequest()
                .getHeaders()
                .getFirst("Authorization");

        try {
            Claims claims = jwtParser.parseClaimsJws(token).getBody();
            exchange.getAttributes().put("userId", claims.getSubject());
            return chain.filter(exchange);
        } catch (Exception e) {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
    }
}
3. Redis限流(RateLimiterConfig.java)
@Configuration
public class RateLimiterConfig {
    @Bean
    public RedisRateLimiter redisRateLimiter(ReactiveRedisTemplate<String, String> redisTemplate) {
        return new RedisRateLimiter(redisTemplate, 
            Config.builder()
                .burstCapacity(50)
                .replenishRate(10)
                .build());
    }

    @Bean
    public RouteLocator rateLimitRoute(RouteLocatorBuilder builder) {
        return builder.routes()
            .route("payment_route", r -> r.path("/payment/**")
                .filters(f -> f.requestRateLimiter(c -> c.setRateLimiter(redisRateLimiter)))
                .uri("lb://payment-service"))
            .build();
    }
}
4. 服务发现路由(DiscoveryRouteConfig.java)
@Configuration
@ConditionalOnDiscoveryEnabled
public class DiscoveryRouteConfig {
    @Bean
    public RouteLocator discoveryRoutes(RouteLocatorBuilder builder) {
        return builder.routes()
            .route(r -> r.path("/account/**")
                .uri("lb://account-service")
                .metadata(Map.of(
                    "version", "v2",
                    "region", "east"
                )))
            .route(r -> r.path("/inventory/**")
                .uri("lb://inventory-service")
                .predicates(p -> p.header("X-Env", "prod")))
            .build();
    }
}

三、高级配置建议

  1. 动态路由更新
@RefreshScope
@Bean
public RouteDefinitionLocator nacosRouteDefinitionLocator(NacosConfigManager configManager) {
    return new NacosRouteDefinitionLocator(configManager);
}
  1. 自定义负载均衡
@Bean
@LoadBalancerClient(name = "user-service", configuration = CustomLoadBalancerConfig.class)
public ServiceInstanceListSupplier discoveryClientSupplier(ConfigurableApplicationContext context) {
    return ServiceInstanceListSupplier.builder()
            .withDiscoveryClient()
            .withCaching()
            .build(context);
}
Logo

一起探索未来云端世界的核心,云原生技术专区带您领略创新、高效和可扩展的云计算解决方案,引领您在数字化时代的成功之路。

更多推荐