Sentinel 搭建應用層面與網關層面的流控保護

源碼:妖精的尾巴/spring-cloud-alibaba?

Nacos 和 Sentinel Dashboard 我這里全是使用window 本地運行的,需要自行下載運行

  1. 服務層面

    • 當你在某個具體的服務上使用Sentinel時,更多的是關注該服務內部資源的保護。例如,你可以針對服務中的某些方法或者接口進行流量控制、熔斷降級等操作。
    • 在這個級別上應用Sentinel,可以直接影響到服務自身的穩定性和可用性,防止由于依賴的服務不可用導致的雪崩效應。
    • 可以使用注解的AOP方式,輕松實現資源的保護

具體做法在具體某個微服務單獨引入?

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

?這里解釋一下,為什么是必須是靜態方法,底層原理是,通過切點對象獲取方法上的注解@SentinelResource,然后getBlockHandlerClass () 拿到類名,最后直接通過類名調用方法,能被類直接調用的方法那必須是靜態的。

2. 網關層面

  • 在網關層(如Spring Cloud Gateway或Zuul)使用Sentinel,可以幫助你對進入系統的請求進行流量控制和管理。這通常涉及到API級別的限流、熔斷以及熱點參數限流等。
  • 通過集成Sentinel的Gateway Filter,你可以為每個路由或全局設置限流規則,這樣就可以根據需要限制到達后端服務的請求速率。
  • 網關層使用Sentinel的優勢在于它可以作為整個系統的第一道防線,保護下游服務免受突發流量的影響。

后續補充:spring-cloud-alibaba-sentinel-gateway 如何從流量第一入口全局流控或者針對某個接口做流控

父工程pom,? ?注意 spring-boot + spring-cloud + spring-cloud-alibaba版本適配?

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.ldj.springcloud</groupId><artifactId>spring-cloud-alibaba</artifactId><version>1.0-SNAPSHOT</version><description>父工程</description><packaging>pom</packaging><!--組件版本管理器--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><!--子工程--><modules><module>common</module><module>order-service</module><module>stock-service</module><module>user-service</module><module>gateway-service</module></modules><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><fastjson.version>1.2.60</fastjson.version><spring.cloud.version>Hoxton.SR8</spring.cloud.version><spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version><jsr305.version>3.0.2</jsr305.version><commons-pool2.version>2.11.1</commons-pool2.version></properties><!--自定義全局版本控制--><dependencyManagement><dependencies><!--spring-cloud--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring.cloud.version}</version><type>pom</type><scope>import</scope></dependency><!--spring-cloud-alibaba--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring.cloud.alibaba.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><dependency><groupId>com.google.code.findbugs</groupId><artifactId>jsr305</artifactId><version>${jsr305.version}</version><scope>runtime</scope></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>${commons-pool2.version}</version></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><skip>true</skip><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude><exclude><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></exclude></excludes></configuration></plugin></plugins></build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><artifactId>spring-cloud-alibaba</artifactId><groupId>com.ldj.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><groupId>com.ldj</groupId><artifactId>gateway-service</artifactId><version>0.0.1-SNAPSHOT</version><name>gateway-service</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><!-- Nacos注冊中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- Nacos配置中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- Spring Cloud Gateway --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- Spring Cloud Sentinel-Gateway --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId></dependency><!-- 這是核心啟動器,必須添加!--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!-- 這個依賴是動態加載規則的關鍵! --><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-extension</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

?bootstrap.properties? (配置全部遷移到Nacos)

# Nacos注冊中心(9100主動注冊到nacos并發送心跳)
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.discovery.namespace=23437cd8-f0c8-4570-8a52-a0db8fd25027
spring.cloud.nacos.discovery.group=DEFAULT_GROUP# Nacos配置中心
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.namespace=23437cd8-f0c8-4570-8a52-a0db8fd25027
# 主配置文件
spring.cloud.nacos.config.extension-configs[0].data-id=application.yml
spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[0].refresh=true
# 流控規則文件
spring.cloud.nacos.config.extension-configs[1].data-id=fcr.yml
spring.cloud.nacos.config.extension-configs[1].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[1].refresh=true

?application.yml

server:port: 9100spring:application:name: gateway-servicecloud:gateway:routes:- id: user_service_routeuri: lb://user-servicepredicates:- Path=/api/user/**filters:- StripPrefix=1sentinel:filter:enabled: true  # 確保啟用了網關適配transport:dashboard: localhost:8033 # Sentinel控制臺地址datasource:# 限流規則flow-rules:nacos:server-addr: localhost:8848 # 使用已存在的Nacos服務器地址namespace: 23437cd8-f0c8-4570-8a52-a0db8fd25027 # 命名空間dataId: fcr.json # 確保這個dataId與Nacos中的限流規則配置文件名一致groupId: DEFAULT_GROUPrule-type: gw-flow # 規則類型:限流(gw-flow)data-type: json# 除限流規則還有下面這些規則,這里不演示了#        # 降級規則
#        degrade-rules:
#          nacos:
#            server-addr: localhost:8848
#            namespace: 23437cd8-f0c8-4570-8a52-a0db8fd25027
#            dataId: degrade-rules.json # Nacos中存儲降級規則的文件名
#            groupId: DEFAULT_GROUP
#            rule-type: degrade # 規則類型:降級(degrade)
#
#        # 系統保護規則
#        system-rules:
#          nacos:
#            server-addr: localhost:8848
#            namespace: 23437cd8-f0c8-4570-8a52-a0db8fd25027
#            dataId: system-rules.json # Nacos中存儲系統保護規則的文件名
#            groupId: DEFAULT_GROUP
#            rule-type: system # 規則類型:系統(system)
#
#        # 授權規則
#        authority-rules:
#          nacos:
#            server-addr: localhost:8848
#            namespace: 23437cd8-f0c8-4570-8a52-a0db8fd25027
#            dataId: authority-rules.json # Nacos中存儲授權規則的文件名
#            groupId: DEFAULT_GROUP
#            rule-type: authority # 規則類型:授權(authority)
#
#        # 熱點參數限流規則
#        param-flow-rules:
#          nacos:
#            server-addr: localhost:8848
#            namespace: 23437cd8-f0c8-4570-8a52-a0db8fd25027
#            dataId: param-flow-rules.json # Nacos中存儲熱點參數限流規則的文件名
#            groupId: DEFAULT_GROUP
#            rule-type: param-flow # 規則類型:熱點參數限流(param-flow)

?fcr.json (流控規則配置文件) 這個json 使用nacos作為存儲? ,它和你在可視化控制面板配置的數據是一樣的

[{"resource": "user_service_route","count": 1,"grade": 1,"limitApp": "default","strategy": 0,"controlBehavior": 0}
]

配置項說明:?

[{"resource": "/get/**",           // 要限流的資源,這里是匹配所有以 /get/ 開頭的URL路徑"count": 5,                      // 限流閾值,表示每秒最多允許5個請求通過"grade": 1,                      // 限流閾值類型:1 表示基于QPS(每秒請求數)進行限流"limitApp": "default",           // 限制的應用,default 表示對所有調用方生效"strategy": 0,                   // 限流策略:0 表示根據調用關系(直接)進行限流"controlBehavior": 0             // 流控效果:0 表示快速失敗(請求超過閾值時直接拒絕)}
]

針對maven依賴說明:

1. 單獨引入spring-cloud-starter-alibaba-sentinel?用于保護普通的 Spring MVC 控制器(Controller)。

2. spring-cloud-starter-alibaba-sentinel-gateway?是專門為?Spring Cloud Gateway?設計的,它利用了 Gateway 的過濾器機制來集成 Sentinel。

踩坑!!!!!!

對于普通應用,Sentinel 的限定資源通常是?Controller?的方法名或 URL 路徑。

對于?Gateway?應用,Sentinel 的資源默認是?路由 ID (Route ID),而不是你配置的?Path?路徑!

也就是說,Sentinel 看到的資源是?user_service_routeapplication.yml?里定義的?id),而不是?/api/user/**

所以 這樣寫是不生效的

[{"resource": "/api/user/**",  // 無效寫法"count": 1,"grade": 1,"limitApp": "default","strategy": 0,"controlBehavior": 0}
]

方式一:針對?路由 ID (Route ID)?配置規則?

[{"resource": "user_service_route", // 改為你的路由ID"count": 1,"grade": 1,"limitApp": "default","strategy": 0,"controlBehavior": 0}
]
方式二(推薦):針對?自定義 API 分組 (API Definition Group)?配置規則(在控制面板操作)

這種方式更靈活,可以基于路徑模式(Path)來限流,更符合你的初衷。

  1. 首先,在 Sentinel 控制臺配置 API 管理

    • 登錄 Sentinel 控制臺。
    • 找到你的?gateway-service?應用。
    • 進入?"網關流控"?->?"API 管理"
    • 點擊?"新增API"
    • 填寫:
      • API 名稱: 例如?user-api
      • 匹配規則: 添加一條規則
        • 類型:?PATH
        • 匹配模式:?/api/user/**?(選擇?MATCH_STR?或?ANT?模式)
    • 保存。??
  2. 然后,配置針對該 API 分組的流控規則

    • 在?"網關流控"?->?"網關流控規則"?頁面。
    • 點擊?"新增網關流控規則"
    • 填寫:
      • 資源模式:?API 名稱?(選擇你剛創建的?user-api)
      • 資源名稱:?user-api?(下拉選擇)
      • Burst: 0 (或根據需要)
      • 閾值類型:?QPS
      • 單機閾值:?1
      • 流控方式:?直接
    • 保存。

效果:這個規則會精確地限制所有匹配 /api/user/** 路徑的請求,QPS 為 1。即使你有多個路由,只要路徑符合,都會被這個規則限制。

注意!!!如果這里沒展示出網關流控規則數據,一般是沒開啟gateway 的過濾器功能

注意!!! 或者是規則類型寫錯

測試效果:狂按發送請求?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/91342.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/91342.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/91342.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

純血鴻蒙 AudioRenderer+AudioCapturer+RingBuffer 實現麥克風采集+發聲

總共兩個類&#xff0c;放到代碼里&#xff0c;就可以快速完成K歌的效果&#xff0c;但應用層這么做延遲是比較高的&#xff0c;只是做一個分享。 類代碼 import { audio } from kit.AudioKit; import { BusinessError } from kit.BasicServicesKit; import { AudioBufferFlow,…

洛谷 P1601 A+B Problem(高精)普及-

題目描述 高精度加法&#xff0c;相當于 ab problem&#xff0c;不用考慮負數。 輸入格式 分兩行輸入。a,b≤10500a,b \leq 10^{500}a,b≤10500。 輸出格式 輸出只有一行&#xff0c;代表 ababab 的值。 輸入輸出樣例 #1 輸入 #1 1 1輸出 #1 2輸入輸出樣例 #2 輸入 #2 1001 909…

Matrix Theory study notes[6]

文章目錄linear spacereferenceslinear space a basis of linear space VkV^kVk,which is x1,x2,...xkx_1,x_2,...x_kx1?,x2?,...xk?,can be called as a coordinate system.let vector v∈Vkv \in V^kv∈Vk and it can be linear expressed on this basis as va1x1a2x2...…

專線與專線之間的區別

下面我們從定義、技術特點、適用場景、優缺點等多個維度來詳細對比&#xff1a;? 一、四種方案簡要定義技術方案定義MPLS 專線運營商基于 MPLS 技術提供的私有虛擬網絡&#xff0c;邏輯隔離、安全可靠VPN over Internet利用公網加密通道&#xff08;如IPSec&#xff09;構建虛…

Git工作流:團隊協作的最佳實踐

目錄 一、什么是 Git 工作流&#xff1f;為什么需要它&#xff1f; 二、基礎&#xff1a;Git 分支核心概念 三、主流 Git 工作流實戰指南 1. 集中式工作流&#xff08;Centralized Workflow&#xff09;&#xff1a;適合小團隊 / 新手 操作步驟&#xff1a; 優缺點&#…

算法競賽階段二-數據結構(35)數據結構單鏈表模擬實現

//鏈表--鏈式存儲的線性表 //存信息和下一個節點位置&#xff0c;數據域和指針域合起來叫節點 //帶頭&#xff08;哨兵位&#xff09;下標為0 //單向&#xff0c;雙向&#xff0c;循環鏈表 //實現 單 //倆足夠大數組 // elem&#xff0c;數據域 // next &#xff0c;指針域…

《Computational principles and challenges in single-cell data integration》

1. 引言&#xff1a;單細胞數據整合的背景與重要性單細胞基因組學技術&#xff08;如scRNA-seq、scATAC-seq等&#xff09;近年來快速發展&#xff0c;能夠以單細胞分辨率揭示細胞異質性和分子機制。然而&#xff0c;不同實驗、樣本和數據模態&#xff08;如RNA表達、DNA甲基化…

蔚來汽車攜手通義靈碼入選 2025 世界人工智能大會標桿案例

7月28日&#xff0c;在2025年世界人工智能大會上&#xff0c;通義靈碼助力蔚來汽車研發效能升級成功入選2025年“人工智能”行業標桿案例薈萃。蔚來汽車已有近 1000 名工程師常態化使用通義靈碼&#xff0c;AI 生成代碼占比超 30%&#xff0c;尤其在蔚來“天探”AI自檢系統的建…

Spring Boot中的this::語法糖詳解

文章目錄前言什么是方法引用&#xff08;Method Reference&#xff09;基本語法方法引用的四種類型1. 靜態方法引用2. 實例方法引用&#xff08;特定對象&#xff09;3. 實例方法引用&#xff08;任意對象&#xff09;4. 構造器引用this::在Spring Boot中的應用場景1. Service層…

VitePress學習筆記

VitePress學習筆記VitePress學習搭建和運行編寫內容mdvue配置站點配置配置searchsearch 提示詞替換使用第三方主題自定義主題設置文檔根目錄國際化文檔navsidebarsearch其他插件vitepress插件markdown-it插件項目開發原始需求和方案自動化流程權限限制VitePress學習 搭建和運行…

C#_創建自己的MyList列表

定義一個數據自己的列表MyList 使用上述描述列表的方式(數組) 列表內也要定義屬于自己的方法 例如 Sort排序 Add添加 等等....思路┌─────────────────────────────────────────────────────────────────…

記錄Linux下ping外網失敗的問題

最近在RK3568上進行開發測試&#xff0c;需要測試一下網絡環境&#xff0c;能否通過瀏覽器訪問外部網絡。測試情況如下&#xff1a; 1、ping內網、網關ip能ping通 2、ping外網ping不通 情況分析&#xff1a; 1、ping外網失敗&#xff08;ping 8.8.8.8也ping不通&#xff0c;說…

Redis 鍵值對操作詳解:Python 實現指南

一、環境準備 1. 安裝依賴庫 pip install redis2. 連接 Redis 數據庫 import redis# 創建 Redis 客戶端連接 r redis.Redis(hostlocalhost, # Redis 服務器地址port6379, # Redis 端口db0, # 數據庫編號&#xff08;0~15&#xff09;passwordNone, …

制造業企業大文件傳輸的痛點有哪些?

在全球化與數字化的浪潮下&#xff0c;制造業企業的大文件傳輸需求日益凸顯&#xff0c;然而諸多痛點也隨之而來&#xff0c;嚴重制約著企業的高效運營與發展。復雜網絡環境導致傳輸穩定性差制造業企業常涉及跨地域、跨國的業務合作與數據交流&#xff0c;網絡環境復雜多變。在…

低速信號設計之 MDIO 篇

一、引言? 在服務器的網絡子系統中,MDIO(Management Data Input/Output)總線雖然傳輸速率相對較低,卻扮演著極為關鍵的角色。它主要負責在 MAC(Media Access Control)層器件與 PHY(Physical Layer)層器件之間搭建起通信的橋梁,實現對 PHY 層器件的有效管理與狀態監控…

AR技術賦能航空維修:精度與效率的飛躍

在航空工業領域&#xff0c;飛機維修與裝配的精度要求越來越高。傳統的維修方法依賴人工操作和經驗判斷&#xff0c;容易產生誤差。隨著增強現實&#xff08;AR www.teamhelper.cn &#xff09;技術的引入&#xff0c;航空維修迎來了革命性的變化。本文將探討AR技術在航空維修中…

設計模式實戰:自定義SpringIOC(理論分析)

自定義SpringIOC&#xff08;理論分析&#xff09; 上一篇&#xff1a;設計模式開源實戰&#xff1a;觀察者模式不知道怎么用&#xff1f;手撕Spring源碼中跟著大佬學編程 上一篇我們研究了大佬在Spring源碼中使用的觀察者模式&#xff0c;今天我們再來聊聊Spring的核心功能—…

人工智能如何改變項目管理:應用、影響與趨勢

人工智能如何改變項目管理&#xff1a;應用、影響與趨勢1. 人工智能如何提升項目規劃與進度安排2. 人工智能在資源分配與優化中的應用3. 人工智能用于風險管理4. 人工智能用于團隊協作與交流5. 人工智能用于項目監控與報告6. 集成人工智能的項目管理軟件6.1 Wrike6.2 ClickUp6.…

【MySql】事務的原理

? 【MySql】事務的原理數據庫的隔離級別原理讀未提交讀已提交可重復讀&#xff08;Repeatable Read&#xff09;串行化&#xff08;最高的隔離級別&#xff0c;強制事務串行執行&#xff0c;避免了所有并發問題&#xff09;MVCC&#xff08;Multi-Version Concurrency Control…

YOLO--目標檢測基礎

一、基本認知1.1目標檢測的定義目標檢測&#xff08;Object Detection&#xff09;&#xff1a;在圖像或視頻中檢測出目標圖像的位置&#xff0c;并進行分類和識別的相關任務。主要是解決圖像是什么&#xff0c;在哪里的兩個具體問題。1.2使用場景目標檢測的使用場景眾多&#…