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
    英文地址,請注明出處:http://en.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提供了高性能的執行能力和直接訪問操作系統底層資源的能力。 鼠標軌跡算法具有以下優勢: 模擬人…