SpringCloud Gateway 实战:搭建 API 网关并实现限流 / 鉴权

一、为什么需要 API 网关?

在微服务架构中,API 网关作为系统的统一入口,承担着路由转发、安全认证、流量控制等核心职责。其核心价值主要体现在三个方面:

  • 统一接入层:通过标准化协议转换,实现多终端(H5、APP、IoT设备)请求的统一处理,降低系统耦合度。例如某电商平台网关日均处理十亿级请求,通过协议转换层将不同终端请求统一为内部微服务可识别的格式。

  • 安全防护中心:集成 JWT 验证、OAuth2.0 授权、IP 黑白名单等多维度防护机制。某金融平台通过网关的 WAF 功能成功拦截 98% 的 SQL 注入攻击,配合令牌桶算法实现 QPS 控制。

  • 流量控制枢纽:支持基于权重的流量分发、金丝雀发布、熔断降级等特性。某物流企业通过网关的灰度发布功能,将新版本迭代风险降低 70%。

二、Spring Cloud Gateway 核心配置

1. 基础依赖配置

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>

2. 路由规则配置

spring: cloud: gateway: routes: - id: user-service uri: lb://user-service predicates: - Path=/api/users/** filters: - StripPrefix=1

  • predicates 定义路由匹配规则(如路径、请求头)

  • filters 实现请求处理(如路径重写、请求头修改)

3. 动态路由实现

通过 Nacos 配置中心实现动态路由更新:

@NacosConfigListener(dataId = "routes", groupId = "GATEWAY_GROUP") public void routeConfigListener(String configInfo) { List<RouteDefinition> definitions = JSON.parseArray(configInfo, RouteDefinition.class); definitions.forEach(route -> { routeDefinitionWriter.save(Mono.just(route)).subscribe(); }); applicationEventPublisher.publishEvent(new RefreshRoutesEvent(routeDefinitionWriter)); }

此方案支持运行时动态调整路由规则,避免重启服务。

三、限流实现方案

1. 基于 Redis 的令牌桶算法

Spring Cloud Gateway 内置令牌桶限流机制,核心参数:

  • capacity:令牌桶最大容量

  • refillTokens:每秒新增令牌数

配置示例:

spring: cloud: gateway: routes: - id: order-service uri: lb://order-service predicates: - Path=/api/orders/** filters: - name: RequestRateLimiter args: redis-rate-limiter: replenishRate: 10 burstCapacity: 20 redisUri: redis://localhost:6379

当请求到达时,系统从令牌桶中获取令牌:

  • 桶中有足够令牌时,请求被放行

  • 令牌不足时,返回 429 状态码

2. 整合 Sentinel 实现高级限流

引入依赖:

<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId> </dependency>

通过 Sentinel 控制台配置:

  • 流控规则:设置 QPS 阈值

  • 降级规则:定义熔断条件

  • 热点参数限流:对特定参数进行限流

四、鉴权实现方案

1. JWT 认证过滤器

@Component public class JwtAuthenticationFilter implements GlobalFilter { @Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { String token = exchange.getRequest().getHeaders().getFirst("Authorization"); if (token == null || !validateToken(token)) { exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); return exchange.getResponse().setComplete(); } return chain.filter(exchange); } }

2. 结合 OAuth2.0 实现授权

配置示例:

spring: security: oauth2: client: registration: google: client-id: google-client-id client-secret: google-client-secret authorization-grant-type: authorization_code scope: openid,email provider: google: issuer-uri: https://accounts.google.com user-info-uri: https://www.googleapis.com/oauth2/v3/userinfo

五、最佳实践建议

  1. 性能优化:采用异步非阻塞 I/O 模型,在 10 核 CPU 环境下可实现 5 万 QPS 处理能力

  2. 监控告警:集成 Prometheus + Grafana 实现指标监控

  3. 缓存策略:对热门 API 的响应结果进行缓存,将响应时间从 200ms 降至 30ms

  4. 灰度发布:通过网关实现金丝雀发布,控制新版本流量比例

六、典型应用场景

  1. 电商大促限流:通过令牌桶算法控制订单接口 QPS,防止系统雪崩

  2. 金融系统安全:结合 WAF 和 IP 黑白名单防御攻击

  3. 物联网设备接入:通过网关统一管理海量设备连接

  4. 微服务流量治理:实现服务间调用的熔断、降级和重试

注:本文所有代码示例均基于 Spring Cloud 2025.0.0 版本,实际使用时请根据项目环境调整配置参数。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐