基于 Spring Cloud Gateway + Sentinel 实现高并发限流保护机制

基于 Spring Cloud Gateway + Sentinel 实现视频播放接口限流保护机制

作者:NovaTube 开发者 | 时间:2025-06
标签:Spring Cloud Gateway、Sentinel、微服务、限流、接口保护


一、背景介绍

在我们开发的在线视频分享平台 NovaTube 中,用户可以上传、播放、点赞、弹幕、投币等操作,其中 视频播放接口心跳上报接口 是高频访问的核心接口,尤其在热门视频爆发流量时,这些接口成为系统性能瓶颈。

这类接口常与 Redis 实时计数器 紧密耦合,如果没有限流保护,很容易造成:

  • Redis 写入/续期压力暴增
  • 计数不准或丢失
  • 系统雪崩或连锁故障

为此,我们引入了 Spring Cloud Gateway + Alibaba Sentinel 的限流机制,对核心接口进行细粒度保护,显著提升了系统在高并发场景下的稳定性。


二、系统架构演进图

         ┌────────────┐│   Client   │└────┬───────┘│┌───────▼────────┐│ SpringCloud Gateway │  ⇦ 【新增:Sentinel限流】└───────┬────────┘│┌───────▼────────────┐│ Video Play Service │  ⇦ 视频播放/心跳接口└────────────────────┘│┌───────▼────────┐│     Redis      │  ⇦ 实时在线人数统计└────────────────┘

三、核心需求

  • ✅ 限制单位时间内的访问频率,防止突发流量冲击
  • ✅ 对不同接口设置不同的限流策略(如 QPS、线程数)
  • ✅ 对不同用户/设备实现细粒度限流
  • ✅ 降级策略支持熔断、快速失败等

四、技术选型

技术说明
Spring Cloud Gateway微服务统一入口网关,支持路由、认证、拦截、过滤
Alibaba Sentinel流控 + 熔断 + 降级中间件,兼容网关流量控制

五、详细实现步骤

1. 引入依赖(pom.xml)

<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>

2. Gateway 限流配置(application.yml)

spring:cloud:gateway:routes:- id: play_routeuri: lb://video-play-servicepredicates:- Path=/api/video/play/**filters:- name: RequestRateLimiterargs:key-resolver: "#{@ipKeyResolver}"redis-rate-limiter.replenishRate: 20  # 每秒生成20个令牌redis-rate-limiter.burstCapacity: 40  # 最大突发请求数

3. IP Key Resolver 限流维度配置

@Bean
@Primary
public KeyResolver ipKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
}

4. Sentinel 限流控制(视频播放接口)

我们对 /api/video/play/heartbeat 接口配置限流规则:

@PostConstruct
public void initSentinelRules() {FlowRule rule = new FlowRule();rule.setResource("/api/video/play/heartbeat");rule.setGrade(RuleConstant.FLOW_GRADE_QPS);rule.setCount(50); // QPS限制为50FlowRuleManager.loadRules(Collections.singletonList(rule));
}

也可通过控制台动态配置,支持实时变更。


5. 降级处理(快速失败返回)

@RestController
public class FallbackController {@RequestMapping("/fallback/video")public String videoFallback() {return "系统繁忙,请稍后重试。";}
}

并在 Gateway 中配置 fallback 路由:

filters:- name: CircuitBreakerargs:name: videoCBfallbackUri: forward:/fallback/video

六、实际效果

✅ 测试效果:

  • 模拟 1000+ 用户并发播放请求
  • 限流前:Redis TPS 超过 10W/s,部分请求失败
  • 限流后:系统平稳运行,无 Redis 异常,限流日志可查

✅ 结果总结:

项目限流前限流后
Redis 写入 QPS>10w~5w
系统响应时间500ms+平均 180ms
请求成功率85%>98%
异常报警次数高频几乎无

七、总结与思考

在高并发场景下,仅靠缓存和数据库支撑远远不够。引入 网关级限流 + Sentinel 限流降级机制,为 NovaTube 系统加装了 “安全气囊”,有效防止核心服务在高压下失效。

后续优化方向:

  • 按用户 ID / Token 限流,更精细化
  • 接入 DashBoard 实时动态变更限流规则
  • 配合 Grafana 实现监控预警

八、参考配置开源地址

可参考官方文档:

  • Sentinel 官方文档
  • Spring Cloud Gateway 限流指南

九、总结

  • 基于 Spring Cloud Gateway + Alibaba Sentinel 对高频接口(如视频播放与心跳上报)实现限流保护,有效防止 Redis 雪崩与系统崩溃,系统稳定性显著提升,支持百万级请求并发访问。

最好对谁限流

NovaTube 在线视频分享平台 的场景中,限流的“最佳粒度”取决于希望保护 系统哪部分资源,目标是 防止滥用、高并发冲击或热点流量导致雪崩

业务维度、系统风险、实现复杂度 三方面来分析:


✅ 最推荐的限流维度:按设备 / 用户 + 视频 ID 限流(组合限流)

也就是说,对“某用户在某视频上的请求频率”进行限流。

🎯 为什么这样做最合理?

限流维度优势适用场景
✅ 用户/设备 + 视频ID精准控制每个用户对每个视频的访问频率
防止刷流量、模拟心跳、恶意攻击
心跳上报接口、播放请求接口、投币等高频操作
🚫 仅对接口限流过于粗糙,热门视频会影响冷门视频导致误伤其他正常请求
⚠️ 仅对视频ID限流会让高并发用户间“抢配额”,用户体验差不适合用户量大的平台
⚠️ 仅对用户限流同一用户可以高频刷多个视频,视频系统仍可能崩不能精确限制资源滥用

🛠 技术实现建议(基于 Spring Cloud Gateway + Redis + Sentinel)

✅ 推荐用法 1:Gateway + Redis 限流器 + 自定义 KeyResolver

@Bean
public KeyResolver userVideoKeyResolver() {return exchange -> {String videoId = exchange.getRequest().getQueryParams().getFirst("videoId");String userId = exchange.getRequest().getHeaders().getFirst("Authorization-UserId");return Mono.just(userId + ":" + videoId);};
}

YAML 配置中:

filters:- name: RequestRateLimiterargs:key-resolver: "#{@userVideoKeyResolver}"redis-rate-limiter.replenishRate: 5   # 每用户对每个视频每秒最多5次redis-rate-limiter.burstCapacity: 10

✅ 推荐用法 2:服务内部 Sentinel 手动限流(适合非网关限流)

String resourceKey = "videoPlay:" + userId + ":" + videoId;
try (Entry entry = SphU.entry(resourceKey)) {// 正常逻辑
} catch (BlockException e) {// 限流逻辑(返回提示或限流页面)
}

✨ 限流维度设计建议总结

维度设计限流类型说明
用户 + 视频ID✅推荐(精细化)精确控制单个用户对单个视频的访问频率
视频ID⚠️可选(防热点)适用于突发大流量的视频,防止Redis写入量暴增
用户ID⚠️次选(防刷)防止某用户频繁发起请求,保护接口
接口级❌不推荐粗粒度,误伤大,性能浪费

🚦使用 Sentinel 实现基于设备 + 视频维度的热点参数限流 —— NovaTube 高并发场景下的稳定性优化实战

在构建的在线视频分享平台 NovaTube 中,随着平台用户数增长,视频播放与心跳上报接口成为高频调用的关键路径,尤其在热门视频或刷流行为频发时,可能对 Redis 与后端服务造成较大压力。为此,我们引入了 Sentinel 热点参数限流机制,按 设备 ID + 视频 ID 的维度对高频接口进行精细化控制。


📌 一、项目背景

在 NovaTube 中,客户端每 5 秒上报一次视频播放心跳数据至接口 /api/video/reportVideoPlayOnline,服务端通过 Redis 记录用户是否在线,并统计当前视频的在线人数。

随着用户量增长,存在以下问题:

  • 热点视频过载: 热门视频访问量集中,Redis 频繁 setex/incr 可能造成瓶颈;
  • 刷流攻击风险: 恶意设备频繁上报心跳,刷流提升播放量;
  • 接口雪崩风险: 高并发压垮接口,引发系统连锁故障。

为应对这些问题,我们决定通过 Sentinel 进行热点参数限流优化。


🎯 二、优化目标

我们希望:

  1. 对接口进行限流保护,避免 Redis 过载;
  2. 支持细粒度限流:按 deviceId + fileId 维度限流;
  3. 具备动态调控能力,支持线上实时调整限流策略;
  4. 兼容 Spring Cloud Gateway 网关架构

🛠️ 三、技术选型

组件用途说明
Spring Cloud GatewayAPI 网关所有接口流量入口
Alibaba Sentinel流量防护框架支持热点参数限流、熔断、降级等功能
Redis实时数据统计存储用户在线状态与视频观看人数

🧩 四、限流实现方案

我们使用 Sentinel 热点参数限流(Hot Parameter Flow Control),其核心思路是:

  • 对请求参数(如 fileIddeviceId)进行统计;
  • 每个参数值设置 QPS 限制(例如,某个视频最多 100 次/s);
  • 当达到阈值时自动拒绝请求,保护系统核心路径。

✅ 示例接口定义

POST /api/video/reportVideoPlayOnline?fileId=abc123&deviceId=device001

☁️ 1. 添加依赖

在网关服务中添加 Sentinel Starter:

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

🧱 2. 启用 Sentinel Gateway 支持

spring:cloud:sentinel:transport:dashboard: localhost:8080gateway:enabled: true

🛣️ 3. 配置 Gateway 路由

spring:cloud:gateway:routes:- id: video-heartbeaturi: lb://video-servicepredicates:- Path=/api/video/reportVideoPlayOnlinefilters:- name: SentinelGatewayFilter

🎮 4. 配置热点参数限流规则

访问 Sentinel 控制台(默认 localhost:8080),配置如下规则:

  • 资源名称/api/video/reportVideoPlayOnline

  • 参数索引:0 表示 fileId,1 表示 deviceId

  • 限流 QPS

    • fileId: 30 QPS
    • deviceId: 10 QPS
    • 支持组合限流(高阶配置)

⚙️ 5. 限流处理(业务服务中可选)

若希望自定义限流后的返回逻辑:

@SentinelResource(value = "reportVideoPlayOnline", blockHandler = "blockHandler")
public Integer reportVideoPlayOnline(String fileId, String deviceId) {// 原有逻辑略...
}public Integer blockHandler(String fileId, String deviceId, BlockException ex) {log.warn("限流触发:fileId={}, deviceId={}", fileId, deviceId);return -1; // 或返回自定义限流提示
}

网关层的限流处理也可以通过 Sentinel 网关回调接口实现。


🧠 五、设计优势

特性描述
✅ 精细化限流支持参数级限流,区分视频和设备
✅ 实时可控Sentinel 控制台支持动态规则修改
✅ 降压保护防止 Redis 和后端接口被过载
✅ 拓展性强可结合熔断、降级策略构建完整流控体系

🧪 六、实战效果

  • 高峰期 Redis CPU 使用率降低 30%+
  • 单视频刷流场景被有效拦截
  • 接口 99.9 分位响应时间降低至 30ms 内
  • 支持根据热点视频动态调整限流阈值

🔧 七、可扩展方向

  • 动态规则持久化到 Nacos,自动下发
  • 将热点参数规则结合报警策略进行监控
  • 结合 IP 维度进一步精细限流
  • 配合 Bucket4j、RateLimiter 实现组合策略限流

📝 结语

通过 Sentinel 的热点参数限流能力,我们成功对 NovaTube 中的关键高频接口实现了稳定性加固,尤其是按 deviceId + fileId 的组合限流设计,既保护了系统,又不牺牲用户体验,是值得推荐的高并发防护方案。


好的,下面是一篇完整技术文档,详细介绍了在你的在线视频播放系统中,如何使用 Sentinel 对单个参数进行限流,分别对视频ID和设备ID限流的优势、适用场景及示例配置。


基于 Sentinel 的单参数限流方案在在线视频播放系统中的应用

1. 背景介绍

在在线视频分享平台中,视频播放及心跳上报接口承载着极高的访问压力。为了防止热点视频或恶意设备刷接口,保护后端服务和缓存(如 Redis)不被压垮,系统需要引入限流机制。

Sentinel 作为阿里巴巴开源的流量防护框架,支持基于接口和参数的细粒度限流。本文重点探讨针对单个参数(视频ID或设备ID)进行限流的设计方案及其优势。


2. 单参数限流设计思路

单参数限流即只针对调用接口的某一个参数维度做QPS或线程数限制。常见的限流参数选项有:

  • 视频ID(fileId)
  • 设备ID(deviceId)

2.1 为什么只对单参数限流?

  • Sentinel 热点参数限流默认只支持单个参数(通过参数索引)配置,操作简单易用。
  • 只针对最关键的热点参数限流,既能有效防止系统过载,也避免限流规则过于复杂。
  • 便于规则维护和监控,降低运维成本。

3. 视频ID限流方案

3.1 限流理由

  • 视频为核心资源,热点视频访问量巨大。
  • 针对视频ID限流,能有效限制某个热门视频的接口调用频率,防止集中流量冲击。
  • 保护Redis和转码、存储等下游服务资源,避免雪崩效应。

3.2 适用场景

  • 防止爆款视频引发接口过载。
  • 限制单个视频的最大并发访问,保证服务整体可用性。
  • 支持运营策略,如对部分付费或高流量视频限流。

3.3 Sentinel 配置示例

配置项说明
资源名reportPlayOnline
限流参数索引0 (假设接口第一个参数为 fileId)
限流阈值100 QPS(视服务器承载能力调整)

3.4 代码示例

@SentinelResource(value = "reportPlayOnline", blockHandler = "handleBlock")
public Integer reportPlayOnline(String fileId, String deviceId) {// 业务处理逻辑return 1;
}public Integer handleBlock(String fileId, String deviceId, BlockException ex) {// 限流降级处理逻辑return -1;
}

4. 设备ID限流方案

4.1 限流理由

  • 设备代表唯一用户终端,单设备发起大量请求可能为恶意刷接口行为。
  • 针对设备ID限流,能防止单个设备过度频繁请求,保障系统整体稳定。
  • 有助于实现反刷机制,防止刷单、刷票等作弊行为。

4.2 适用场景

  • 防刷单:限制单设备的最大请求频率。
  • 保护服务器免受异常设备请求攻击。
  • 降低因异常设备产生的资源浪费。

4.3 Sentinel 配置示例

配置项说明
资源名reportPlayOnline
限流参数索引1 (假设接口第二个参数为 deviceId)
限流阈值10 QPS(根据实际业务调整)

4.4 代码示例

@SentinelResource(value = "reportPlayOnline", blockHandler = "handleBlock")
public Integer reportPlayOnline(String fileId, String deviceId) {// 业务处理逻辑return 1;
}public Integer handleBlock(String fileId, String deviceId, BlockException ex) {// 限流降级处理逻辑return -1;
}

5. 两者对比及推荐实践

维度视频ID限流设备ID限流
保护对象热点视频资源及其后端服务单设备防刷及异常流量控制
典型阈值较大(几十至几百QPS)较小(个位至十几QPS)
业务影响限制热门视频流量,影响视频观看体验限制恶意设备请求,保护系统稳定
运维难度规则相对简单,易于监控需配合反刷策略和设备识别机制
推荐使用场景大规模视频播放平台,防止热点视频挤兑防刷单、异常请求拦截

6. 总结

  • 单参数限流是 Sentinel 实现热点限流的主流方式,简单高效。
  • 视频ID限流,有效防止热点视频带来的压力峰值,保护服务端资源。
  • 设备ID限流,有助于防刷及控制单设备异常请求,保障系统安全。
  • 生产环境中建议两者结合使用,实现多维度流量保护,确保系统稳定和良好用户体验。

7. 附录:Sentinel 控制台限流规则配置示例

资源名参数索引阈值类型阈值 (QPS)说明
reportPlayOnline0QPS每秒请求数100视频ID限流
reportPlayOnline1QPS每秒请求数10设备ID限流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/909474.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CountDownLatch入门代码解析

文章目录 核心思想&#xff1a;火箭发射倒计时 &#x1f680;最简单易懂的代码示例代码解析运行流程分析 核心思想&#xff1a;火箭发射倒计时 &#x1f680; 想象一下发射火箭的场景&#xff0c;在按下最终的发射按钮之前&#xff0c;必须有好几个系统同时完成自检&#xff0…

用Python写一个可视化大屏

用Python打造可视化大屏&#xff1a;数据洞察新视界 在当今数据爆炸的时代&#xff0c;数据可视化成为了理解和传达复杂信息的关键工具。Python作为一门强大且灵活的编程语言&#xff0c;提供了丰富的库和工具&#xff0c;让我们能够创建出令人惊叹的可视化大屏。本文将带你逐步…

20250611让NanoPi NEO core开发板在Ubuntu core16.04系统下开机自启动的时候拉高GPIOG8

rootNanoPi-NEO-Core:/# touch open_4g_ec20.sh rootNanoPi-NEO-Core:/# vi open_4g_ec20.sh 【打开使能引脚200 IOG8】 echo 200 > /sys/class/gpio/export echo out > /sys/class/gpio/gpio200/direction echo 1 > /sys/class/gpio/gpio200/value 【切记&#xff1a…

解惑1、为何大容量电容滤低频,小容量电容滤高频

一、电容的种类&#xff1a; 链接&#xff1a; 二、疑惑 理论推算&#xff1a; 1&#xff09;Zc1/wc&#xff0c;那么大容量和小容量的电容&#xff0c;不应该都是 越高频越阻抗低&#xff0c;越容易通过&#xff1f; 2&#xff09;大容量&#xff0c;积蓄电荷速度慢&#…

如何有效监控JVM环境,保障应用性能

缓慢的Java应用程序、意外崩溃和晦涩的内存问题——这些都是JVM可能在默默承受压力的信号。JVM监控对于保障Java应用的正常运行时间和最佳性能至关重要&#xff0c;它提供了对Java虚拟机内存、线程和CPU资源使用情况的可见性&#xff0c;使管理员能够在影响终端用户之前识别性能…

python:PyQt5 开发一个邮件客户端,能编写邮件,发送邮件及附件

PyQt5 邮件客户端 下面是一个简洁高效的邮件客户端实现&#xff0c;支持编写邮件、添加附件和发送邮件功能&#xff1a; 编写 eMailClient_qt.py 如下 # -*- coding: utf-8 -*- """ 用 PyQt5 开发一个邮件客户端&#xff0c;能编写邮件&#xff0c;发送邮件及…

React【回顾】 深层次面试详解:函数式组件核心原理与高级优化

以下是对 React 深层次内容的全面解析,涵盖函数式组件的核心原理、性能优化、设计模式和最新特性: 🔧 一、React 核心机制剖析 1. Fiber 架构深解 Fiber 节点结构:function FiberNode(tag, pendingProps, key) {this.tag = tag; // 组件类型(函数组件=0, 类…

视觉语言模型的“视而不见“

这项研究发现&#xff0c;号称能“看图说话”的视觉语言模型&#xff08;VLMs&#xff09;&#xff0c;在处理需要真正“看”懂图片的纯视觉任务&#xff08;如判断深度、找对应点、认物体材质等&#xff09;时&#xff0c;表现远不如它们自己内部的“眼睛”&#xff08;视觉编…

Wyn 商业智能与 3D 大屏的深度融合应用

引言 在当今数字化快速发展的时代&#xff0c;数据可视化对于企业的决策和管理变得至关重要。商业智能软件作为数据可视化的重要工具&#xff0c;能够帮助企业将海量的数据转化为直观、易懂的信息。而 3D 大屏以其沉浸式、立体的展示效果&#xff0c;为数据可视化带来了全新的…

使用docker compose部署netmaker打通内网

准备 我看官网推荐都是使用ssl然后要ssl证书&#xff0c;不想走弯路了 一、docker-compose.yml version: "3.4"services:netmaker:container_name: netmakerimage: gravitl/netmaker:v0.90.0restart: unless-stoppedports:- "18081:18082"- "50051…

Linux集市采购指南[特殊字符]:yum和apt的“抢货”大战!

Linux集市采购指南&#x1f345;&#xff1a;yum和apt的“抢货”大战&#xff01; ✨ 欢迎来到 Linux软件生态集市&#xff01;这里分两大阵营&#xff1a; &#x1f96c; CentOS/RHEL传统菜市场&#xff1a;派稳重的 yum 大叔当采购员&#xff0c;做事一板一眼&#xff1b;✨…

DataX 框架学习笔记

官方仓库&#xff1a; https://github.com/alibaba/DataX?tabreadme-ov-file 1. 介绍 1.1. 基本介绍&#xff1a; DadaX 是阿里云 DataWorks 数据集成 的开源版本&#xff08;异构数据同步、离线数据同步工具 / 平台&#xff09;。主要抽象为 Reader 和 Writer 插件&#…

MaxCompute的Logview分析详解

文章目录 一、Logview简介1、概述2、标题与功能3、基础信息 二、作业详情1、Job Details2、Fuxi Sensor3、Result①当前作业运行成功&#xff0c;显示的为运行结果。②当前作业运行失败&#xff0c;显示的为失败原因。 4、SourceXML5、SQL Script6、History7、SubStatusHistory…

HTML5白云飘飘动态效果教程

HTML5白云飘飘动态效果教程 这里写目录标题 HTML5白云飘飘动态效果教程效果介绍实现步骤步骤一&#xff1a;创建HTML结构步骤二&#xff1a;设计CSS样式步骤三&#xff1a;添加JavaScript交互 代码解析HTML结构解析CSS样式解析JavaScript功能解析 自定义调整总结 效果介绍 本教…

tcp高难度问题

以下是针对这些问题&#xff0c;在面试场景下&#xff0c;既保证理论扎实、逻辑清晰&#xff0c;又具备交流延展性的回答思路与内容&#xff0c;可根据实际面试节奏和面试官反馈灵活调整展开&#xff1a; 1. 客户端端口号如何确定的&#xff1f; 面试官您好&#xff0c;客户端…

广东省省考备考(第二十八天6.13)—资料分析(第二节课)

基期与现期 官方定义&#xff1a;作为对比参照的是基期&#xff0c;而相对于基期比较的是现期 通俗说法&#xff1a;时间靠前的为基期&#xff0c;时间靠后的为现期 增长量与增长率 增长量用来表述基期量与现期量变化的绝对量&#xff1b; 增长率用来表述基期量与现期量变化…

pytorch 中前向传播和后向传播的自定义函数

系列文章目录 文章目录 系列文章目录一、torch.autograd.function代码实例 在开始正文之前&#xff0c;请各位姥爷动动手指&#xff0c;给小店增加一点访问量吧&#xff0c;点击小店&#xff0c;同时希望我的文章对你的学习有所帮助。本文也很简单&#xff0c;主要讲解pytorch的…

【项目实训#08】HarmonyOS知识图谱前端可视化实现

【项目实训#08】HarmonyOS知识图谱前端可视化实现 文章目录 【项目实训#08】HarmonyOS知识图谱前端可视化实现一、背景简介二、技术方案与架构设计2.1 技术选型2.2 组件架构设计 三、知识图谱可视化组件实现3.1 KGResultTab组件设计组件模板结构不同状态的处理用户交互控制节点…

【软件开发】什么是DSL

什么是DSL DSL&#xff08;Domain-Specific Language&#xff0c;领域特定语言&#xff09;是一种为特定领域或任务设计的编程语言&#xff0c;目的在于提高该领域中的表达能力与开发效率。 1 在脚本语言中的 DSL 是什么&#xff1f; 在脚本语言&#xff08;如 Python、Lua、…

JasperReport生成PDF/A类型文档

当JasperReport导出的文档为PDF/A模式时&#xff0c;该PDF为只读可以防止被修改。 设置导出参数 JRPdfExporter exporter new JRPdfExporter();exporter.setExporterInput(SimpleExporterInput.getInstance(jasperPrints));exporter.setExporterOutput(new SimpleOutputStre…