【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.mzph.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;为工业自动化领…