【Sentinel】Sentinel配置zk持久化

代碼

import cn.hutool.core.util.StrUtil;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.datasource.zookeeper.ZookeeperDataSource;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.zookeeper.ZookeeperProperties;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.List;@Component
public class ZkDataSourceConfig {@Value("${spring.application.name}")private String appname;@Value("${spring.profiles.active}")private String profile;@Resourceprivate ZookeeperProperties zookeeperProperties;@PostConstructpublic void init() {loadRules(zookeeperProperties.getConnectString());}private void loadRules(String remoteAddress) {// 規則會持久化到zk的/groupId/flowDataId節點// groupId和和flowDataId可以用/開頭也可以不用// 建議不用以/開頭,目的是為了如果從Zookeeper切換到Nacos的話,只需要改數據源類名就可以String groupId = StrUtil.format("sentinel/{}:{}", appname, profile);ReadableDataSource<String, List<FlowRule>> flowRuleDataSource = new ZookeeperDataSource<>(remoteAddress, groupId, "FlowRule",// source 就是從 zookeeper 中讀出來的字符串source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));//限流FlowRuleManager.register2Property(flowRuleDataSource.getProperty());ReadableDataSource<String, List<DegradeRule>> degradeRuleDataSource = new ZookeeperDataSource<>(remoteAddress, groupId, "DegradeRule",// source 就是從 zookeeper 中讀出來的字符串source -> JSON.parseObject(source, new TypeReference<List<DegradeRule>>() {}));//降級DegradeRuleManager.register2Property(degradeRuleDataSource.getProperty());}
}

ZK配置參考

/sentinel/應用名:環境=FlowRule=[{"resource": "資源1", "limitApp": "default", "grade": 1, "count": 40.0, "strategy": 0, "controlBehavior": 2, "maxQueueingTimeMs": 100000 }, {"resource": "資源2", "limitApp": "default", "grade": 1, "count": 40.0, "strategy": 0, "controlBehavior": 2, "maxQueueingTimeMs": 100000 }, {"resource": "資源3", "limitApp": "default", "grade": 1, "count": 10.0, "strategy": 0, "controlBehavior": 2, "maxQueueingTimeMs": 100000 } ]

使用

public class demo {public static void main(String[] args) {// 定義規則initFlowRules();//用SphU.entry()的形式定義資源while (true) {try (Entry entry = SphU.entry("myResource")) {//與規則定義中的rule.setResource("myResource")一致// 被保護的業務邏輯...System.out.println("業務資源訪問成功!");} catch (BlockException ex) {// 處理被流控的邏輯:限流或降級...System.out.println("資源訪問失敗!!!");} finally {if (entry != null) {entry.exit();//必須退出資源調用}}}//用SphO.entry()的形式定義資源while (true) {if(SphO.entry("myResource")){//與規則定義中的rule.setResource("myResource")一致try{// 被保護的業務邏輯...System.out.println("業務資源訪問成功!");} catch (BlockException ex) {// 處理被流控的邏輯:限流或降級...System.out.println("資源訪問失敗!!!");}finally{SphO.exit();//必須退出資源調用}}}//上面兩種方式對代碼侵入性很高,可用注解的方式定義資源while(true){getUserById("111");}}//文章開始通過zk加載配置,此處通過代碼定義規則	//定義規則 private static void initFlowRules(){List<FlowRule> rules = new ArrayList<>();// 存儲規則 FlowRuleFlowRule rule = new FlowRule();rule.setResource("myResource");	// 指定限流規則作用于哪個資源上,資源名為字符串,可為任意有標識意義的方法名/接口名/其他字符串,此處資源名為"myResource"rule.setGrade(RuleConstant.FLOW_GRADE_QPS);	// 限流類型為QPS模式:限制QPSrule.setCount(10);	   // QPS不得超出10rule.setLimitApp("default");	// 針對的調用來源,default代表不區分來源rules.add(rule);FlowRuleManager.loadRules(rules);// 加載規則}//定義"myResource"資源,并設置違背sentinel流控規則時的處理方法handlerException()@SentinelResource(value="myResource",blockHandler="handlerException")public User getUserById(String id){return new User("數據庫用戶")}//注意:此處理方法的參數必須和定義資源的方法getUserById參數一致()同時加上【BlockException exception】參數public User handlerException(String id,BlockException exception){return new User("流控用戶");}
}
Entry entry = null;
try {entry = SphU.entry("myResource"); //此處說明資源// 被保護的業務邏輯...
} catch (BlockException e1) {// 資源訪問阻止,被限流或被降級,進行相應的處理操作...
} finally {if (entry != null) {entry.exit();}
}

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

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

相關文章

信息系統工程師--八大績效域-交付績效域

信息系統工程師的八大績效域包括&#xff1a;干系人、團隊、開發方法和生命周期、項目工作、規劃、交付、度量、不確定性。 預期目標 1、項目有助于實現業務目標和戰略 2、項目實現了預期成果 3、在預定時間內實現了項目收益 4、項目團隊對需求有清晰的理解 5、干系人接受…

GitLab的原理及應用詳解(五)

本系列文章簡介: 隨著軟件開發的不斷進步和發展,版本控制系統成為了現代軟件開發過程中不可或缺的一部分。而GitLab作為其中一種流行的版本控制工具,在軟件開發領域享有廣泛的應用。GitLab不僅提供了強大的版本控制功能,還集成了項目管理、持續集成和部署、代碼審查等多個功…

web學習筆記(五十七)

目錄 1. 面試題總結 1.1 public和assets區別 1.2 vite的作用 1.3 vue單頁面應用 1.4 組件分為兩種類型&#xff1a; 1.5 App.vue文件 1.6 main.js 1.7 vue2中為什么不能直接監聽到數組的改變&#xff1f; 2. .vue頁面的組成 3. ref 響應式數據 1. 面試題總結 1.1…

Web3革命:探索科技與物聯網的無限可能

引言 Web3時代正在悄然而至&#xff0c;帶來了對互聯網的徹底顛覆和改變。作為互聯網的下一代&#xff0c;Web3不僅是技術革新的延續&#xff0c;更是對傳統互聯網模式的重新構想。在這個新時代&#xff0c;科技與物聯網的結合將迎來無限的可能性&#xff0c;將探索到一片全新…

iOS系統故障怎么辦?這三種蘋果手機系統修復方法你一定要知道

隨著蘋果手機使用時間越長&#xff0c;蘋果手機有時也會出現系統問題&#xff0c;如卡頓、崩潰、無法啟動等。這些問題不僅影響用戶的使用體驗&#xff0c;還可能導致數據丟失。因此&#xff0c;掌握蘋果手機系統修復方法顯得尤為重要。本文將詳細介紹蘋果手機系統修復的常見方…

Leetcode 3153. Sum of Digit Differences of All Pairs

Leetcode 3153. Sum of Digit Differences of All Pairs 1. 解題思路2. 代碼實現 題目鏈接&#xff1a;3153. Sum of Digit Differences of All Pairs 1. 解題思路 這一題的話只需要統計一下每一個位上0-9各自出現了多少次即可。 然后&#xff0c;對于每一位&#xff0c;答…

數倉領域,Serving 是什么概念?

在數據倉庫&#xff08;Data Warehouse&#xff09;和更廣泛的數據工程領域中&#xff0c;“Serving”通常指的是將處理和優化后的數據提供給最終用戶或應用程序的過程。這包括數據的查詢、檢索、展示等操作&#xff0c;使得數據能夠在決策支持、報告、分析、或機器學習等應用中…

大模型之Ollama:在本地機器上釋放大型語言模型的強大功能

LlaMA 3 系列博客 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;一&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;二&#xff09; 基于 LlaMA 3 LangGraph 在windows本地部署大模型 &#xff08;三&#xff09; 基于 LlaMA…

實戰Java虛擬機-實戰篇

一、內存調優 1.內存溢出和內存泄漏 內存泄漏&#xff08;memory leak&#xff09;&#xff1a;在Java中如果不再使用一個對象&#xff0c;但是該對象依然在GC ROOT的引用鏈上&#xff0c;這個對象就不會被垃圾回收器回收&#xff0c;這種情況就稱之為內存泄漏。內存泄漏絕大…

一番賞小程序開發,為玩家帶來線上抽賞魅力

隨著人們對娛樂消費的增加&#xff0c;以及二次元文化的快速發展&#xff0c;以動漫IP為主的一番賞受到了越來越多的年輕人關注&#xff0c;一番賞市場迎來了黃金發展期&#xff01; 一番賞的運營模式是以“限量”為主&#xff0c;不管什么商品數量都是有限的&#xff0c;因此…

微軟剛發布的Copilot+PC為什么讓Intel和AMD尷尬?2024 AI PC元年——產業布局及前景展望

美國東部時間5月20日在微軟位于華盛頓的新園區舉行的發布會上&#xff0c;宣布將旗下AI助手Copilot全面融入Windows系統&#xff0c;能夠在不調用云數據中心的情況下處理更多人工智能任務。 “將世界作為一個提示詞就從Windows系統開始”。微軟的新PC將是“CopilotPC”&#xf…

[Algorithm][回溯][記憶化搜索][最長遞增子序列][猜數字大小Ⅱ][矩陣中的最長遞增路徑]詳細講解

目錄 1.最長遞增子序列1.題目鏈接2.算法原理詳解3.代碼實現 2.猜數字大小 II1.題目鏈接2.算法原理詳解3.代碼實現 3.矩陣中的最長遞增路徑1.題目鏈接2.算法原理詳解3.代碼實現 1.最長遞增子序列 1.題目鏈接 最長遞增子序列 2.算法原理詳解 題目解析&#xff1a;從每個位置&am…

內部類知識點

什么是內部類&#xff1f; 內部類何時出現&#xff1f;B類是A類的一部分&#xff0c;且B單獨存在無意義 內部類分類 成員內部類&#xff1a; 當內部類被private修飾后&#xff0c;不能用方法2 調用外部類成員變量 內部類里面有隱藏的outer this來記錄 靜態內部類 創建對象&…

警惕Mallox勒索病毒的最新變種hmallox,您需要知道的預防和恢復方法。

引言 &#xff1a; 在數字化時代&#xff0c;數據已成為企業和個人最寶貴的資產之一。然而&#xff0c;隨著技術的不斷發展&#xff0c;網絡威脅也日益猖獗&#xff0c;其中.hmallox勒索病毒以其獨特的加密手段和狡猾的傳播方式&#xff0c;成為了網絡安全領域的一顆“隱形炸彈…

水電集中抄表是什么?

1.定義分析&#xff1a;水電集中抄表 水電集中抄表是一種現代化能源管理體系方法&#xff0c;它利用先進的信息科技&#xff0c;如物聯網技術、云計算等&#xff0c;完成對水電表數據的遠程智能采集與處理。這種方法改變了傳統的人工上門服務抄表方式&#xff0c;提高了效率&a…

Biome-BGC生態系統模型與Python融合技術實踐應用

Biome-BGC是利用站點描述數據、氣象數據和植被生理生態參數&#xff0c;模擬日尺度碳、水和氮通量的有效模型&#xff0c;其研究的空間尺度可以從點尺度擴展到陸地生態系統。 在Biome-BGC模型中&#xff0c;對于碳的生物量積累&#xff0c;采用光合酶促反應機理模型計算出每天…

ECharts實現地圖飛線

echarts版本&#xff1a;https://echarts.apache.org/zh/changelog.html v5.x.x版本&#xff1a;不提供china.js和china.json文件 v4.x.x版本&#xff1a;使用npm安裝echarts&#xff0c;默認包含china.js和china.json文件 目錄 一、Html工程 二、vue工程 三、vue工程 四、矢…

c/c++ 編譯過程

C的編譯過程通常可以分為四個階段&#xff1a;預處理、編譯、匯編和鏈接。下面是這四個階段的詳細說明&#xff1a; 預處理&#xff08;Preprocessing&#xff09;&#xff1a;在這個階段&#xff0c;預處理器&#xff08;cpp&#xff09;會處理源代碼文件中的預處理指令&#…

【科普知識】伺服電機中的內置制動器

在工業自動化和機器人技術快速發展的今天&#xff0c;伺服電機作為核心驅動元件&#xff0c;其性能與功能直接影響整個系統的運行效率與穩定性。 近年來&#xff0c;一體化伺服電機技術不斷融合創新&#xff0c;并逐步加入了許多新的硬件和軟件的功能&#xff0c;為工業自動化領…