RuoYi-Cloud 接入 Sentinel 的 3 种限流方式

场景:

  • 服务:ruoyi-robot(对外接口统一在 /external/gs/**

  • 网关:ruoyi-gateway(转发到 ruoyi-robot

  • 注册/配置:Nacos

  • 流控:Sentinel 1.8.x + 控制台 Dashboard(我用 8718 端口)

  • 目标:既能“一把梭”限整个对外能力(按 URL 前缀),也能给个别 API 做业务化兜底提示

总览:三种限流姿势放在一起怎么选?

方案生效层级是否改 robot 代码规则是否持久化命中后的典型返回适用场景
A. 服务内方法级 @SentinelResource服务要(按方法)可持久化,也可不持久化200 + 业务 JSON(我自定义429精细化/业务化兜底
B. 网关控制台临时规则网关HTTP 500(默认)演示/排障,重启丢失
C. 网关 API 分组 + Nacos 规则(推荐)网关✅(Nacos)HTTP 500给整组 URL 做统一限流

官方参考文档:服务网关 | RuoYi

A. 服务内方法级限流(@SentinelResource

1)服务接入 Sentinel 控制台

ruoyi-robot-dev.yml(节选)

spring:cloud:sentinel:eager: truetransport:dashboard: 127.0.0.1:8718

目的:ruoyi-robot 也把自身资源(URL、注解资源)上报到控制台,便于在服务内做细粒度流控/降级。

2)对具体方法加注解与兜底方法

/external/gs/robots 为例

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;@SentinelResource(value = "listRobots",blockHandler = "listRobotsBlockHandler",fallback = "listRobotsFallback")
@GetMapping("/robots")
public AjaxResult listRobots(@RequestParam(value = "robotSn", required = false) String robotSn) {// ...业务逻辑...return AjaxResult.success(robots);
}/** 限流/熔断被触发时走这里(签名要匹配,最后一个参数必须是 BlockException) */
public AjaxResult listRobotsBlockHandler(String username, BlockException ex) {return AjaxResult.error("请求超过最大数,请稍候再试"); // 你现在返回的是 code=429 的 JSON
}

注意

  • blockHandler/fallback 方法的返回类型要与原方法一致,参数也要能匹配(blockHandler 最后必须有 BlockException)。

  • 兜底方法可以写到同类或独立类(独立类需 public static)。

3)命中时的返回差异

  • 这种方式是在服务内处理,你返回的是 业务 JSON(比如 {"code":429,"msg":"Too Many Requests"}),HTTP 状态多半还是 200

  • 如果你希望连 HTTP 状态也用 429,可以在 blockHandler抛出带 429 的异常并用全局异常处理器转成响应;或统一让网关(方案 A/B)兜底。

4)如何“看见”和“控住”这个资源

  • 只要接口被调用一次,控制台就会在 ruoyi-robotsentinel_spring_web_context 和你自定义的 "listRobots" 资源下出现统计。

  • ruoyi-robot 应用上新增一条针对 listRobots流控规则(比如 QPS=1),即可触发 blockHandler

B. 网关控制台临时规则(不持久化)

  • 做法:直接在 Sentinel 控制台给 ruoyi-gateway 新增流控规则(可选按 Route,也可选 API 分组)。

  • 特点:重启规则就没了,适合验想法/演示。

  • 行为:和 A 一样,返回 500,只是数据不落 Nacos。

C. 网关「API 分组」限流

1)Nacos 保存网关规则(持久化)

  • API 分组定义ruoyi-gateway-gw-api-defs

  • [{"apiName": "external-gs-api","predicateItems": [{ "pattern": "/external/gs/**", "matchStrategy": 1 }]}
    ]
    

    分组限流规则ruoyi-gateway-gw-flow

  • [{"resource": "external-gs-api","resourceMode": 1,   // 1=API分组, 0=Route"grade": 1,          // 1=QPS"count": 1,          // 阈值 1 QPS"intervalSec": 1,"controlBehavior": 0,// 直接拒绝"burst": 0}
    ]
    

    2)网关接入 Sentinel 与 Nacos 数据源

    ruoyi-gateway-dev.yml(节选)

    spring:cloud:sentinel:eager: truetransport:dashboard: 127.0.0.1:8718datasource:gw-api:nacos:server-addr: localhost:8848group-id: DEFAULT_GROUPnamespace: publicdata-id: ruoyi-gateway-gw-api-defsdata-type: jsonrule-type: gw-api-groupgw-flow:nacos:server-addr: localhost:8848group-id: DEFAULT_GROUPnamespace: publicdata-id: ruoyi-gateway-gw-flowdata-type: jsonrule-type: gw-flow
    

    3)验证

# 连续高频请求
curl -i http://localhost:8080/external/gs/robots

curl -i http://localhost:8080/external/gs/robots
命中限流时:HTTP/1.1 500 Too Many Requests,终端能看到 Blocked by Sentinel (flow limiting)。

Sentinel 控制台:在 ruoyi-gateway 应用下,请求链路 / API 管理 都能看到 external-gs-api 的统计与规则。

    Sentinel 限流常见问题与修复方案

    FAQ 1:Code200,401令牌不能为空

    症状

    • 压测的时候报Code200,401令牌不能为空

    根因

    • ruoyi-gateway-dev.yml中验证码没关

    • 没有为你的自定义API设置白名单

    修复

    • captcha中把enabled改为:false

    • 在ignore中为你的API设置白名单

    FAQ 2:控制台看不到实例 / 资源列表是空的

    症状

    • Sentinel 控制台没有 ruoyi-gatewayruoyi-robot 实例

    • 或者“资源链路”里没有 URL/方法名

    根因

    • Dashboard 端口不一致 / 服务没连上

    • Sentinel 默认懒加载,未触发调用不汇报

    • 依赖缺失 / 网段不通

    修复

    • application-*-dev.yml 开启:

    spring:cloud:sentinel:eager: truetransport:dashboard: 127.0.0.1:8718
    

    启动 Dashboard(端口一致):

    java -Dserver.port=8718 \-Dcsp.sentinel.dashboard.server=localhost:8718 \-Dcsp.sentinel.api.port=8719 \-jar sentinel-dashboard-1.8.x.jar
    

    打一次接口触发资源上报:

    curl -i http://localhost:8080/external/gs/robots
    

    FAQ 3:Nacos 已配规则,但网关不生效

    症状

    • 控制台能看到实例,但限流不触发,或“API 管理”看不到你的分组。

    根因

    • DataId / group / namespace / rule-type / data-type 任一不匹配

    • JSON 不合法

    • 你自定义的API类在Nacos没有设置Sentinel

    修复清单

    • ruoyi-gateway-dev.yml 的数据源必须与 Nacos 完全一致:

    • gw-api-defsgw-flowapiName/resource 要对应(你用的是 external-gs-api)。

      datasource:gw-api:nacos:server-addr: localhost:8848group-id: DEFAULT_GROUPnamespace: publicdata-id: ruoyi-gateway-gw-api-defsdata-type: jsonrule-type: gw-api-groupgw-flow:nacos:server-addr: localhost:8848group-id: DEFAULT_GROUPnamespace: publicdata-id: ruoyi-gateway-gw-flowdata-type: jsonrule-type: gw-flow
      
    • 以ruoyi-robot-dev.yml为例,增加配置

      spring:cloud:sentinel:# 取消控制台懒加载eager: truetransport:# 控制台地址dashboard: 127.0.0.1:8718

    FAQ 4:我压不出 429,是不是没生效?

    可能原因

    • 阈值太高 / 压测强度不够

    • burstintervalSec 没理解

    修复

    • 先把阈值设成 count: 1intervalSec: 1 做冒烟。

    • 命令行快速压测:

    # Linux/Mac
    for i in {1..10}; do curl -s -o /dev/null -w "%{http_code}\n" http://localhost:8080/external/gs/robots; done# Windows(PowerShell)
    1..10 | % { (Invoke-WebRequest -UseBasicParsing http://localhost:8080/external/gs/robots).StatusCode }
    

    FAQ 5:怎么区分 B 与 C

        1.看控制台“API类型”这一列

    • C(API 分组/Nacos 下发):在 ruoyi-gateway → API管理 必须能看到 external-gs-api;对应的流控规则里“API 类型”显示 自定义API,API 名称就是 external-gs-api

    • B(Route ID 临时规则/控制台添加):在 ruoyi-gateway → 流控规则 里“API 类型”显示 Route ID,比如 ruoyi-robot(你的第二张图就是这个)。

         2.看“重启后的持久性”

    • C:重启 gateway 后,规则会 自动重新出现(来自 Nacos 的 gw-api-defs / gw-flow)。

    • B:如果你只是控制台临时添加,重启就没了(除非你的控制台本身配置了 Nacos Publisher,把它也持久化到 Nacos——多数环境没配)。

         3.看配置是否存在

    • C 必须有 gateway 里的这段 datasource 配置 + Nacos 中的两个 DataId:
      ruoyi-gateway-gw-api-defs(API 分组)和 ruoyi-gateway-gw-flow(分组流控)。

    • B 不需要这两个 DataId,单靠控制台在 “流控规则(Route ID)” 新增就能生效。

        4.看“API管理”页面是否有分组

    • Cexternal-gs-api 一定会出现在 API管理 列表里。

    • B:API管理可以是空的(就像你第一张图),依然能在“流控规则”里对 Route ID 限流。

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

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

    相关文章

    快速搭建python HTTP Server测试环境

    这里用python http.server搭建一个api测试环境,自定义请求处理程序,以模拟不同api相应。 1 服务代码 /api/data,端口8000,GET 返回json数据为"{"message": "This is a sample API response"}" 代…

    Docker容器定时任务时区Bug导致业务异常的环境变量配置解决方案

    Docker容器定时任务时区Bug导致业务异常的环境变量配置解决方案 🌟 Hello,我是摘星! 🌈 在彩虹般绚烂的技术栈中,我是那个永不停歇的色彩收集者。 🦋 每一个优化都是我培育的花朵,每一个特性都是…

    解锁Dify与MySQL的深度融合:MCP魔法开启数据新旅程

    文章目录解锁Dify与MySQL的深度融合:MCP魔法开启数据新旅程引言:技术融合的奇妙开篇认识主角:Dify、MCP 与 MySQL(一)Dify:大语言模型应用开发利器(二)MCP:连接的桥梁&am…

    杂记 02

    1 WSL安装 WSL的安装遇到了问题,睡醒起来发现电脑蓝屏了,linux系统没装好,但是好像大部分开发环境都是linux下需要的,先这样用一下吧,到时候再说。可以问下前辈开发细节,主要是网络代理问题,保…

    剧本杀小程序系统开发:重构推理娱乐生态

    在娱乐产业蓬勃发展的今天,推理娱乐作为一种充满智慧和挑战的娱乐形式,受到了越来越多人的喜爱。剧本杀,作为推理娱乐的代表之一,正以其独特的魅力吸引着大量玩家。而剧本杀小程序系统开发,则为推理娱乐生态的重构带来…

    力扣习题:基本计算器

    本片内容我们将针对于一个力扣中的一道很经典的习题:基本计算器。 这道题目十分经典,在很多大厂的面试题中都有出现过 因此我们将进一步来学习 该题目代码已经上传作者的个人gitee:CPP 学习代码库: C代码库新库,旧有C仓库满员了喜…

    Element用法---Loading 加载

    仅供参考 文章目录一、加载动画二、Loading 组件1、指令调用 Loading2、服务调用 Loading一、加载动画 当我们打开某个页面时,如果需要加载的数据很多或者网络很差,页面加载就会非常缓慢,中间可能会很长时间显示空白,那么就需要加…

    飞算AI 3.2.0实战评测:10分钟搭建企业级RBAC权限系统

    飞算AI 3.2.0实战评测:10分钟搭建企业级RBAC权限系统 🌟 Hello,我是摘星! 🌈 在彩虹般绚烂的技术栈中,我是那个永不停歇的色彩收集者。 🦋 每一个优化都是我培育的花朵,每一个特性都…

    事务的四大特性

    事务(Transaction)是数据库管理系统(DBMS)中用于保证数据操作正确性和一致性的核心机制。事务的特性通常用 ACID 四个字母概括,分别代表 原子性(Atomicity)、一致性(Consistency&…

    WIN11系统下Open3D 0.19.0支持GPU的python版本

    前往Open 3D官网下载https://github.com/isl-org/Open3D下载对应版本的源码。 根据官方手册利用cmake进行编译&安装,其中需要修改一些代码适应于win 11系统,编译时间较长需要耐心等待。最后,安装结果如下图,搞了四天&#xff…

    ICCV 2025 | 4相机干掉480机位?CMU MonoFusion高斯泼溅重构4D人体!

    ​​​​ 近日,卡内基梅隆大学(Carnegie Mellon University)的研究团队在动态场景重建领域取得重要进展。其发表于ICCV 2025的论文《MonoFusion: Sparse-View 4D Reconstruction via Monocular Fusion》提出创新方法MonoFusion 。该方法突破常…

    ADB 无线调试连接(Windows + WSL 环境)

    gradle wrapper --gradle-version 8.4 Windows WSL 成功连接 Android 设备(用于 ./gradlew installDebug)的完整过程总结:✅ ADB 无线调试连接过程(Windows WSL 环境) 📌 目标:从 WSL 中通过 …

    【.net core】【wetercloud】处理前端项目免登陆,且从前端项目跳转至系统内时的问题

    1.前端项目访问后台内容时免登陆(一般用于后台接口需要校验登陆时)处理思路:将后台用户的登陆校验令牌信息在用户登录后添加至前端项目访问地址的参数列表中,如:https://yourdomain/Home/Index#/https://yourdomain/vi…

    设备 AI 知识库,管理效率新飞跃

    在设备管理领域,高效解决设备故障、合理规划维护工作对企业生产运营至关重要。易点易动设备管理系统新推出的设备 AI 知识库,为提升管理效率带来了新契机。设备 AI 知识库集成先进的人工智能技术,是设备管理领域的创新应用。易点易动设备管理…

    C#绘制斐波那契螺旋

    Fabonacci 数列,也就是”兔子数列“, 如果第一项为0的话,就是, 0,1,1,2,3,5,8,13,21,34,55,89……

    JavaScript 任务 - clearTimeout 函数与 clearInterval 函数

    clearTimeout 函数 1、基本介绍 clearTimeout 函数用于取消先前通过 setTimeout 函数设置的定时器 clearTimeout(【timeoutID】)参数说明timeoutID要取消的定时器的标识符,这个 ID 是由 setTimeout 函数返回的2、演示 let timeoutId1 setTimeout(() > {console.…

    在 CentOS 7 中使用 systemd 创建自定义服务

    systemd 创建自定义服务简述创建自定义服务步骤文件覆盖优先级创建服务流程在 /etc/systemd/system/ 目录下创建 .service 文件(需 root 权限):编写服务配置模板Systemd 服务文件三大区块详解[Unit] 区块 - 服务元数据与依赖[Service] 区块 -…

    【QT】printsupport库远程实现打印机打印

    【QT】printsupport库远程实现打印机打印 前言 思路 实现 当前所有可用打印机浏览 打印预览 打印输出 手动选择打印 自动打印 防呆补充 库打包 前言 在打印机的通讯控制方式中,有USB、网口、串口、WIFI等,针对局域网环境下,用自研软件控制打印机打印的应用场景,针对自研软…

    LT3045EDD#TRPBF ADI亚德诺 超低噪声LDO稳压器 电子元器件IC

    LT3045EDD#TRPBF ADI 超低噪声LDO稳压器专业解析1. 产品技术档案LT3045EDD#TRPBF是ADI(Analog Devices Inc.)推出的超低噪声/超高PSRR线性稳压器,采用DFN-12 (3x3mm)封装,以其0.8μVRMS超低噪声和79dB超高频PSRR成为精密电源设计。…

    易语言模拟真人鼠标轨迹算法 - 非贝塞尔曲线

    一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟人…