在支付场景中,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)限流:
- 定义热点参数资源:在网关过滤器中标记参数(需自定义
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);
};
}
}
- 在控制台配置热点规则:
- 资源名:
/pay/order/create - 参数索引:0(对应标记的userId)
- 单机阈值:100(单个用户每秒最多100次支付请求)
5. 熔断降级:保护后端脆弱服务
目标:当后端支付服务(如对接某银行接口)响应慢或错误率高时,自动熔断,避免级联失败。
实现:配置网关熔断规则(针对路由):
- 资源名:
pay-order-service(路由ID) - 熔断策略:慢调用比例
- 最大RT:500ms(超过500ms视为慢调用)
- 比例阈值:0.5(慢调用占比≥50%)
- 熔断时长:10s(熔断后10秒内直接返回降级响应)
- 最小请求数:100(统计窗口内至少100个请求才判断熔断)
四、规则持久化:避免重启丢失
支付场景规则需长期稳定生效,通过 Nacos 实现规则持久化:
- 引入依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.8.6</version>
</dependency>
- 配置 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
- 在 Nacos 中创建
pay-gateway-flow-rules配置,内容为JSON格式的规则列表:
[
{
"resource": "pay-order-service",
"count": 6000,
"grade": 1,
"limitApp": "default",
"strategy": 0
}
]
五、测试验证
- 正常流量测试:用 JMeter 模拟每秒5000次
pay-order-service请求,应全部通过。 - 限流触发测试:模拟每秒7000次
pay-order-service请求,超出的1000次应返回503 支付请求繁忙。 - 熔断测试:人为让后端
pay-order-service接口响应延迟至1s,100个请求后,网关应触发熔断,10秒内直接返回降级响应。
六、支付场景特殊优化
- 优先级降级:限流时优先保障
VIP用户支付请求(通过limitApp配置白名单)。 - 流量预热:大促开始时,通过“Warm Up”模式(预热时间30s)逐步提升 QPS 阈值,避免瞬间流量冲击。
- 日志追踪:集成 Sleuth + Zipkin,记录限流/熔断事件,便于排查支付失败原因。
总结
通过 Spring Cloud Gateway 与 Sentinel 的结合,支付系统可实现“全局-路由-接口-参数”四级流量管控,在保障核心支付业务稳定性的同时,灵活应对大促等高频场景。核心是按业务优先级分配资源,并通过规则持久化和监控告警确保系统长期可靠运行。