支付系统可实现“全局-路由-接口-参数”四级流量管控

79 阅读6分钟

在支付场景中,Spring Cloud Gateway 作为流量入口,结合 Sentinel 可实现支付请求的精细化限流、熔断降级,保护后端支付服务免受流量冲击。以下是具体实现方案,涵盖环境搭建、核心配置、规则设计及支付场景适配:

一、技术选型与依赖配置

1. 核心组件

  • Spring Cloud Gateway:支付流量入口,负责路由转发、请求过滤。
  • Sentinel:提供网关层限流、熔断能力,依赖 sentinel-spring-cloud-gateway-adapter 适配模块。
  • Sentinel Dashboard:可视化配置限流规则、监控流量指标。

2. 依赖引入(pom.xml

<!-- Spring Cloud Gateway -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<!-- Sentinel 核心 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.6</version>
</dependency>

<!-- Sentinel 网关适配 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-spring-cloud-gateway-adapter</artifactId>
    <version>1.8.6</version>
</dependency>

<!-- Sentinel 控制台通信 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>1.8.6</version>
</dependency>

二、基础配置:网关与Sentinel整合

1. 配置Sentinel控制台通信(application.yml

spring:
  application:
    name: pay-gateway  # 应用名称,将显示在Sentinel控制台
  cloud:
    gateway:
      routes:
        # 支付核心服务路由(订单支付)
        - id: pay-order-service
          uri: lb://pay-order-service  # 后端支付服务(负载均衡)
          predicates:
            - Path=/pay/order/**  # 匹配支付订单接口
          filters:
            - StripPrefix=1  # 去除路径前缀(/pay/order → /order)
        
        # 支付查询服务路由
        - id: pay-query-service
          uri: lb://pay-query-service
          predicates:
            - Path=/pay/query/**
          filters:
            - StripPrefix=1

        # 退款服务路由(非核心)
        - id: pay-refund-service
          uri: lb://pay-refund-service
          predicates:
            - Path=/pay/refund/**
          filters:
            - StripPrefix=1

# Sentinel配置
spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080  # Sentinel控制台地址
        port: 8719  # 与控制台通信的本地端口
      scg:
        # 限流后默认响应(JSON格式)
        fallback:
          mode: response
          response-body: '{"code":503,"msg":"支付请求繁忙,请稍后重试","success":false}'

2. 注册Sentinel网关过滤器

通过配置类注册 Sentinel 网关适配器,实现对网关请求的拦截与规则校验:

import com.alibaba.csp.sentinel.adapter.gateway.sc.SentinelGatewayFilter;
import com.alibaba.csp.sentinel.adapter.gateway.sc.exception.SentinelGatewayBlockExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.http.codec.ServerCodecConfigurer;
import org.springframework.web.reactive.result.view.ViewResolver;

import java.util.List;

@Configuration
public class SentinelGatewayConfig {

    // 注册Sentinel网关过滤器(核心拦截器)
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SentinelGatewayFilter sentinelGatewayFilter() {
        return new SentinelGatewayFilter();
    }

    // 注册限流异常处理器(自定义返回格式)
    @Bean
    @Order(Ordered.HIGHEST_PRECEDENCE)
    public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler(
            List<ViewResolver> viewResolvers, 
            ServerCodecConfigurer serverCodecConfigurer) {
        return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
    }
}

三、支付场景规则设计与实现

根据支付业务优先级(核心订单支付 > 查询 > 退款),设计多级限流规则:

1. 全局限流:控制网关总流量

目标:限制网关每秒总请求数,避免后端服务被整体压垮。
实现:在 Sentinel 控制台配置网关流控规则

  • 资源名pay-gateway(网关应用名,代表全局)
  • 阈值类型:QPS
  • 阈值:10000(根据后端服务承载能力调整)
  • 限流模式:直接
  • 匹配策略:全部(对所有路由生效)

2. 路由级限流:按业务优先级分配流量

目标:为核心支付路由预留更多资源,非核心路由适当降级。

路由ID业务类型QPS阈值说明
pay-order-service订单支付(核心)6000保障60%总流量用于核心支付
pay-query-service支付查询3000分配30%流量
pay-refund-service退款(非核心)1000分配10%流量,超出则降级

配置方式:在 Sentinel 控制台新增网关流控规则,资源名填写路由ID(如 pay-order-service),阈值按上表设置。

3. 接口级限流:保护敏感支付接口

目标:对高频/高耗资源的具体接口(如 创建订单支付)单独限流。
实现:通过“路径匹配”精准控制,在控制台配置:

  • 资源名/pay/order/create(具体接口路径)
  • 阈值类型:QPS
  • 阈值:3000(每秒最多3000次创建支付请求)
  • 限流模式:直接
  • 匹配策略:路径

4. 热点参数限流:针对高风险场景

目标:限制单个用户/商户的高频支付请求(防止刷单、恶意请求)。
实现:通过 Sentinel 热点规则,对请求参数(如 userId)限流:

  1. 定义热点参数资源:在网关过滤器中标记参数(需自定义 RequestOriginParser):
import com.alibaba.csp.sentinel.adapter.gateway.sc.request.SentinelGatewayRequestContext;
import com.alibaba.csp.sentinel.adapter.gateway.sc.util.SentinelGatewayUtil;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.server.reactive.ServerHttpRequest;

@Configuration
public class HotParamConfig {
    @Bean
    public GlobalFilter hotParamMarkFilter() {
        return (exchange, chain) -> {
            ServerHttpRequest request = exchange.getRequest();
            // 提取userId作为热点参数(假设从请求头或参数中获取)
            String userId = request.getHeaders().getFirst("X-User-Id");
            if (userId != null) {
                // 将userId标记为热点参数,资源名为接口路径
                String resource = request.getPath().value();
                SentinelGatewayRequestContext ctx = SentinelGatewayRequestContext.getCurrentContext();
                SentinelGatewayUtil.setHotParam(resource, userId);
            }
            return chain.filter(exchange);
        };
    }
}
  1. 在控制台配置热点规则:
  • 资源名/pay/order/create
  • 参数索引:0(对应标记的userId)
  • 单机阈值:100(单个用户每秒最多100次支付请求)

5. 熔断降级:保护后端脆弱服务

目标:当后端支付服务(如对接某银行接口)响应慢或错误率高时,自动熔断,避免级联失败。
实现:配置网关熔断规则(针对路由):

  • 资源名pay-order-service(路由ID)
  • 熔断策略:慢调用比例
  • 最大RT:500ms(超过500ms视为慢调用)
  • 比例阈值:0.5(慢调用占比≥50%)
  • 熔断时长:10s(熔断后10秒内直接返回降级响应)
  • 最小请求数:100(统计窗口内至少100个请求才判断熔断)

四、规则持久化:避免重启丢失

支付场景规则需长期稳定生效,通过 Nacos 实现规则持久化:

  1. 引入依赖:
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.8.6</version>
</dependency>
  1. 配置 Nacos 数据源(application.yml):
spring:
  cloud:
    sentinel:
      datasource:
        # 网关流控规则持久化
        gw-flow:
          nacos:
            server-addr: localhost:8848
            data-id: pay-gateway-flow-rules
            group-id: SENTINEL_GROUP
            rule-type: gw-flow  # 网关流控规则类型
        # 热点规则持久化
        hot-param:
          nacos:
            server-addr: localhost:8848
            data-id: pay-gateway-hot-rules
            group-id: SENTINEL_GROUP
            rule-type: param_flow
  1. 在 Nacos 中创建 pay-gateway-flow-rules 配置,内容为JSON格式的规则列表:
[
  {
    "resource": "pay-order-service",
    "count": 6000,
    "grade": 1,
    "limitApp": "default",
    "strategy": 0
  }
]

五、测试验证

  1. 正常流量测试:用 JMeter 模拟每秒5000次 pay-order-service 请求,应全部通过。
  2. 限流触发测试:模拟每秒7000次 pay-order-service 请求,超出的1000次应返回 503 支付请求繁忙
  3. 熔断测试:人为让后端 pay-order-service 接口响应延迟至1s,100个请求后,网关应触发熔断,10秒内直接返回降级响应。

六、支付场景特殊优化

  • 优先级降级:限流时优先保障 VIP用户 支付请求(通过 limitApp 配置白名单)。
  • 流量预热:大促开始时,通过“Warm Up”模式(预热时间30s)逐步提升 QPS 阈值,避免瞬间流量冲击。
  • 日志追踪:集成 Sleuth + Zipkin,记录限流/熔断事件,便于排查支付失败原因。

总结

通过 Spring Cloud Gateway 与 Sentinel 的结合,支付系统可实现“全局-路由-接口-参数”四级流量管控,在保障核心支付业务稳定性的同时,灵活应对大促等高频场景。核心是按业务优先级分配资源,并通过规则持久化和监控告警确保系统长期可靠运行。