Spring Cloud Gateway应用场景
摘要:Spring Cloud Gateway应用场景分为路由控制、安全控制、流量治理和系统集成四大类。典型实现包括路径重写路由、JWT认证、Redis限流和服务发现路由等,分别通过过滤器、自定义GlobalFilter和负载均衡等技术实现。文中提供了核心场景的代码示例,如RewritePath过滤器、JwtAuthFilter和RedisRateLimiter等,并给出动态路由更新和自定义负载均
·
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();
}
}
三、高级配置建议
- 动态路由更新:
@RefreshScope
@Bean
public RouteDefinitionLocator nacosRouteDefinitionLocator(NacosConfigManager configManager) {
return new NacosRouteDefinitionLocator(configManager);
}
- 自定义负载均衡:
@Bean
@LoadBalancerClient(name = "user-service", configuration = CustomLoadBalancerConfig.class)
public ServiceInstanceListSupplier discoveryClientSupplier(ConfigurableApplicationContext context) {
return ServiceInstanceListSupplier.builder()
.withDiscoveryClient()
.withCaching()
.build(context);
}
更多推荐




所有评论(0)