Sentinel-自定義資源實現流控和異常處理

目錄

使用SphU的API實現自定義資源

BlockException

使用@SentinelResource注解定義資源

SentinelResourceAspect


使用Sentinel實現限流降級等效果通常需要先把需要保護的資源定義好,之后再基于定義好的資源為其配置限流降級等規則。

Sentinel對于主流框架,例如 Web Servlet、Dubbo、Spring Cloud、gRPC、Spring WebFlux、Reactor 等都做了適配,具體可以參考主流框架適配。只需要引入對應的依賴即可方便地整合 Sentinel。

但框架適配主要是對一些http或RPC接口做資源定義,如果涉及到一些代碼塊或者方法是無法做資源定義的,這種情況下就需要通過編碼方式自定義資源,并通過捕獲異常的方式實現限流或降級的邏輯。

    使用SphU的API實現自定義資源

    SphU類在sentinel-core依賴中,主要用于對資源的訪問控制。當系統想要執行某個資源操作時,通過調用 SphU.entry 方法來檢查該資源是否受到流量控制。

    • 如果資源當前處于限流狀態,那么 SphU.entry 會拋出 BlockException 異常,表示請求被限流,此時系統可以進行降級操作。
    • 如果資源沒有受到限流,那么 SphU.entry 會返回一個 Entry 對象,表示一次資源操作開始,系統可以繼續執行相關的業務代碼。
    • 注意SphU.entry 需要和 entry.exit 一起配合使用,確保在業務代碼執行完后執行?entry.exit

    BlockException

    BlockException是sentinel流控觸發后的異常類,其下包含很多個子類,分別對應不同的場景:

    • FlowException ? ? ? ?限流異常
    • ParamFlowException ? 熱點參數限流的異常
    • DegradeException ? ? 降級異常
    • AuthorityException ? 授權規則異常
    • SystemBlockException 系統規則異常

    使用SphU的API前,需要確保項目中直接或間接引入了sentinel-core的依賴(通常框架適配的stater中已經引入了)

    <dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-core</artifactId><version>1.8.6</version>
    </dependency>

    下面是一個通過SphU自定義資源的實例代碼:

    public PriceDTO queryPrice(String skuCode) {PriceParam param = new PriceParam();param.setSkuCode(skuCode);Entry entry = null;try {entry = SphU.entry(SentinelResourceConstant.MARKETING_SPECIAL_ACTIVITY_QUERY_SHOP_SKU_PRICE);return productFacade.queryPrice(param).unboxing();}catch(FlowException e) {log.error("查詢商品價格接口觸發限流,skuCode:{}", skuCode);return null;}catch(DegradeException e) {log.error("查詢商品價格接口觸發降級,skuCode:{}", skuCode);return null;} finally {if (entry != null) {entry.exit();}}
    }

    使用@SentinelResource注解定義資源

    上面通過SphU API自定義資源可以最小粒度的控制要保護的資源,但是侵入較大,增加了代碼的復雜性。而另外一中方式就是使用@SentinelResource 注解,這種方式對代碼入侵程度相對較低。

    SentinelResourceAspect

    使用@SentinelResource 注解來實現資源定義,原理與上面的API其實是一樣的,Sentinel 中定義了SentinelResourceAspect 通過切面方式攔截后同樣通過SphU API來實現流控功能。

    既然注解方式是通過切面來實現的,那么在使用注解方式進行資源定義的前提就是先通過配置的方式將 SentinelResourceAspect 注冊為一個 Spring Bean,有了這個bean以后@SentinelResource注解才可以生效。

    @Configuration
    public class SentinelAspectConfiguration {@Beanpublic SentinelResourceAspect sentinelResourceAspect() {return new SentinelResourceAspect();}
    }

    開啟配置后即可在代碼中使用@SentinelResource注解對某個方法進行Sentinel資源定義。

    @Service
    public class TestService {// 資源定義并設置流控處理@SentinelResource(value = "hello", blockHandler = "exceptionHandler", fallback = "helloFallback")public String hello(long s) {return String.format("Hello at %d", s);}// Fallback 函數,函數簽名與原函數一致或加一個 Throwable 類型的參數.public String helloFallback(long s) {return String.format("Halooooo %d", s);}// Block 異常處理函數,參數最后多一個 BlockException,其余與原函數一致.public String exceptionHandler(long s, BlockException ex) {// Do some log here.ex.printStackTrace();return "Oops, error occurred at " + s;}
    }
    

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

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

    相關文章

    Linux信號處理解析:從入門到實戰

    Linux信號處理全解析&#xff1a;從入門到實戰 一、初識Linux信號&#xff1a;系統級的"緊急電話" 信號是什么&#xff1f; 信號是Linux系統中進程間通信的"緊急通知"&#xff0c;如同現實中的交通信號燈。當用戶按下CtrlC&#xff08;產生SIGINT信號&…

    Java的Selenium的特殊元素操作與定位之select下拉框

    如果頁面元素是一個下拉框&#xff0c;我們可以將此web元素封裝為Select對象 Select selectnew Select(WebElement element); Select對象常用api select.getOptions();//獲取所有選項select.selectBylndex(index);//根據索引選中對應的元素select.selectByValue(value);//選…

    藍橋云客 刷題統計

    刷題統計 問題描述 小明決定從下周一開始努力刷題準備藍橋杯競賽。他計劃周一至周五每天做 a 道題目&#xff0c;周六和周日每天做 b 道題目。請你幫小明計算&#xff0c;按照計劃他將在第幾天實現做題數大于等于 n 題&#xff1f; 輸入格式 輸入一行包含三個整數 a, b 和 …

    三防筆記本有什么用 | 三防筆記本有什么特別

    在現代社會&#xff0c;隨著科技的不斷進步&#xff0c;筆記本電腦已經成為人們工作和生活的重要工具。然而&#xff0c;在一些特殊的工作環境和極端條件下&#xff0c;普通筆記本電腦往往難以滿足需求。這時&#xff0c;三防筆記本以其獨特的設計和卓越的性能&#xff0c;成為…

    智能體和RPA都需要程序思維,如何使用影刀的變量?

    歡迎來到濤濤聊AI&#xff0c; 不管AI還是RPA&#xff0c;都需要用到編程思想才能完成批量工作。今天研究了下影刀的變量。 變量類型 根據變量值選擇相應的類型&#xff0c;可選擇任意一種影刀所支持的數據類型 變量值 指定變量中保存的值&#xff0c;會根據不同的類型設置…

    【藍橋杯】算法筆記3

    1. 最長上升子序列(LIS) 1.1. 題目 想象你有一排數字,比如:3, 1, 2, 1, 8, 5, 6 你要從中挑出一些數字,這些數字要滿足兩個條件: 你挑的數字的順序要和原來序列中的順序一致(不能打亂順序) 你挑的數字要一個比一個大(嚴格遞增) 問:最多能挑出多少個這樣的數字? …

    性能測試之jmeter的基本使用

    簡介 Jmeter是Apache的開源項目&#xff0c;基于Java開發&#xff0c;主要用于進行壓力測試。 優點&#xff1a;開源免費、支持多協議、輕量級、功能強大 官網&#xff1a;https://jmeter.apache.org/index.html 安裝 安裝步驟&#xff1a; 下載&#xff1a;進入jmeter的…

    【NLP 面經 7、常見transformer面試題】

    目錄 1. 為何使用多頭注意力機制&#xff1f; 2. Q和K使用不同權重矩陣的原因 3. 選擇點乘而非加法的原因 4. Attention進行scaled的原因 5. 對padding做mask操作 6. 多頭注意力降維原因 7. Transformer Encoder模塊簡介 8. 乘以embedding size的開方的意義 9. 位置編碼 10. 其…

    【深度學習】CNN簡述

    文章目錄 一、卷積神經網絡&#xff08;CNN&#xff09;二、CNN結構特性1. CNN 典型結構2. 局部連接3. 權重共享4.空間或時間上的次采樣 三、理解層面 一、卷積神經網絡&#xff08;CNN&#xff09; 卷積神經網絡(Convolutional Neural Network&#xff0c;CNN)是一種用于處理…

    理解OSPF 特殊區域NSSA和各類LSA特點

    本文基于上文 理解OSPF Stub區域和各類LSA特點 在理解了Stub區域之后&#xff0c;我們再來理解一下NSSA區域&#xff0c;NSSA區域用于需要引入少量外部路由&#xff0c;同時又需要保持Stub區域特性的情況 一、 網絡總拓撲圖 我們在R1上配置黑洞路由&#xff0c;來模擬NSSA區域…

    論文閱讀筆記:Denoising Diffusion Implicit Models (5)

    0、快速訪問 論文閱讀筆記&#xff1a;Denoising Diffusion Implicit Models &#xff08;1&#xff09; 論文閱讀筆記&#xff1a;Denoising Diffusion Implicit Models &#xff08;2&#xff09; 論文閱讀筆記&#xff1a;Denoising Diffusion Implicit Models &#xff08…

    藍橋杯2024年第十五屆省賽真題-R 格式

    題目鏈接&#xff1a; 思路&#xff1a; 通過數組模擬d的每一位&#xff0c;逐位進行計算&#xff0c;從而實現對d的精確處理。 代碼&#xff1a; #include<bits/stdc.h> #define int long long using namespace std; const int N 2020;int n; string s; vector<i…

    深入探索 Linux Top 命令:15 個實用示例

    在 Linux 系統管理中&#xff0c;top 命令是系統性能監控不可或缺的工具。它能夠實時顯示系統的 CPU、內存、進程等資源的使用情況&#xff0c;幫助您快速識別性能瓶頸和異常進程。本文將詳細介紹 15 個實用的 top 命令使用示例&#xff0c;旨在幫助您更高效地進行系統管理與優…

    15.1linux設備樹下的platform驅動編寫(知識)_csdn

    上一章我們詳細的講解了 Linux 下的驅動分離與分層&#xff0c;以及總線、設備和驅動這樣的驅動框架。基于總線、設備和驅動這樣的驅動框架&#xff0c; Linux 內核提出來 platform 這個虛擬總線&#xff0c;相應的也有 platform 設備和 platform 驅動。 上一章我們講解了傳統的…

    Eclipse 視圖(View)

    Eclipse 視圖(View) Eclipse 視圖(View)是 Eclipse 界面的重要組成部分,它提供了用戶交互的平臺,使得用戶可以通過圖形界面來編輯、調試、分析代碼等。在本文中,我們將深入探討 Eclipse 視圖的功能、使用方法以及它們在軟件開發中的作用。 1. 視圖的功能 Eclipse 視圖具…

    Python解決“數字插入”問題

    Python解決“數字插入”問題 問題描述測試樣例解題思路代碼 問題描述 小U手中有兩個數字 a 和 b。第一個數字是一個任意的正整數&#xff0c;而第二個數字是一個非負整數。她的任務是將第二個數字 b 插入到第一個數字 a 的某個位置&#xff0c;以形成一個最大的可能數字。 你…

    ubuntu部署ollama+deepseek+open-webui

    ubuntu部署ollamadeepseekopen-webui 全文-ubuntu部署ollamadeepseekopen-webui 大綱 Ollama部署 安裝Ollama&#xff1a;使用命令apt install curl和curl -fsSL https://ollama.com/install.sh | sh ollama-v網絡訪問配置&#xff1a;設置環境變量OLLAMA_HOST0.0.0.0:11434&…

    Java的Selenium常用的元素操作API

    click 觸發當前元素的點擊事件 clear() 清空內容 sendKeys(...) 往文本框一類元素中寫入內容 getTagName() 獲取元素的的標簽名 getAttribute(屬性名) 根據屬性名獲取元素屬性值 getText() 獲取當前元素的文本值 isDisplayed() 查看元素是否顯示 get(String url) 訪…

    洛谷題單3-P1035 [NOIP 2002 普及組] 級數求和-python-流程圖重構

    題目描述 已知&#xff1a; S n 1 1 2 1 3 … 1 n S_n 1\dfrac{1}{2}\dfrac{1}{3}…\dfrac{1}{n} Sn?121?31?…n1?。顯然對于任意一個整數 k k k&#xff0c;當 n n n 足夠大的時候&#xff0c; S n > k S_n>k Sn?>k。 現給出一個整數 k k k&#xff0…

    CMDB平臺(進階篇):3D機房大屏全景解析

    在數字化轉型的浪潮中&#xff0c;數據中心作為企業信息架構的核心&#xff0c;其高效、智能的管理成為企業競爭力的關鍵因素之一&#xff0c;其運維管理方式也正經歷著革命性的變革。傳統基于二維平面圖表的機房監控方式已難以滿足現代企業對運維可視化、智能化的需求。樂維CM…