sentinel中监听器的运用--规则管理

sentinel中监听器的运用–规则管理

规则结构

类图关系

类关系图如下
在这里插入图片描述

Rule

将规则抽象成一个类, 规则与资源是紧密关联的, 也就是说规则作用于资源。因此, 我们需要将规则表示为一个类, 并包含一个获取资源的方法

这里采用接口的原因就是规则是一个抽象概念而非具体实现。所以我们将规则定义为接口, 让各个子类(如黑白名单规则、流量控制规则、熔断降级等规则)实现各自的逻辑

public interface Rule {// 获取资源 nameString getResource();
}

AbstractRule

规则通用的三个字段, 设置抽象类实现Rule接口, 对下述字段复用

  1. 规则id
  2. 资源名称
  3. 限制来源
    • 限制来源指的是诸如黑名单值、白名单值等, 也就是说限制哪些来源访问
// 实现规则 Rule 接口
public abstract class AbstractRule implements Rule {// 规则idprivate Long id;// 资源名称private String resource;// 限制来源, 多个用逗号隔开, 比如黑名单规则, 限制userId是1和3的访问, 那么就写setLimitApp(1,3)private String limitApp;@Overridepublic String getResource() {return resource;}
}

为什么limitApp不使用 List<String>

其实两者都是可行的, 你可以使用逗号分隔, 也可以使用 List<String>, 只要能满足需求即可

规则管理

PropertyListener接口

如何管理这些规则呢?比如如何感知到规则的变化?

sentinel采用的是监听器监听规则的变化, 这个监听器是PropertyListener

/*** 当SentinelProperty.updateValue(Object) 需要通知监听器时, 此类保存回调方法* 这里的泛型T存储的是规则, 如 AuthorityRule、DegradeRule、FlowRule 等*/
public interface PropertyListener<T> {/*** 规则变更时触发的方法* @param value 更新的value*/void configUpdate(T value);/*** 首次加载规则时触发* @param value value加载的值*/void configLoad(T value);
}

为什么使用泛型 T 而不是接口 Rule?我们 AuthorityRuleDegradeRule 等类不都是接口 Rule 的子类吗?

这里使用泛型 T 是因为此接口不仅服务于规则 Rule, 还服务于Sentinel的其他场景, 所以采用了泛型 T

因此, 会有很多具体的类去实现 PropertyListener<T>, 并传入具体的类型, 例如, FlowPropertyListener

// com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManagerpublic class FlowRuleManager {// 其他代码...// 这个是内布类, 实现 PropertyListener 接口, 并传入具体的类型 List<FlowRule>private static final class FlowPropertyListener implements PropertyListener<List<FlowRule>> {// 方法参数也是具体类型, 而不是泛型 T@Overridepublic synchronized void configLoad(List<FlowRule> value) {// 做一些变更逻辑}// 方法参数也是具体类型, 而不是泛型 T@Overridepublic synchronized void configUpdate(List<FlowRule> conf) {// 做首次初始化逻辑}}// 其他代码...
}

为什么类型是 List<FlowRule> 而不是FlowRule呢?

因为一个资源可以对应多个规则, 而不是简单的一个规则, 比如上线的流控规则, QPS是一种, 线程数又是一种, 一个资源多种策略, 一对多的关系, 所以采用List集合

PropertyListener<T>的实现类如下图
在这里插入图片描述

SentinelProperty接口

SentinelProperty 的类, 专门负责管理所有 PropertyListener<T> 子类的监听器

包含以下方法:

  • addListener(PropertyListener<T> listener):添加监听器。
  • removeListener(PropertyListener<T> listener):移除监听器。
  • updateValue(T newValue):当规则配置发生变化时, 调用此方法进行通知
public interface SentinelProperty<T> {// 添加监听器void addListener(PropertyListener<T> listener);// 移除监听器void removeListener(PropertyListener<T> listener);// 当配置发生变化时, 通过调用 SentinelProperty 的 updateValue 方法通知所有的监听器boolean updateValue(T newValue);
}

DynamicSentinelProperty

Sentinel 提供了一个默认的 SentinelProperty 实现:DynamicSentinelProperty

// 实现 SentinelProperty 接口
public class DynamicSentinelProperty<T> implements SentinelProperty<T> {// 使用 `CopyOnWriteArraySet` 存储所有监听器 `PropertyListener` 子类, 确保线程安全和高性能protected Set<PropertyListener<T>> listeners = new CopyOnWriteArraySet<>();private T value = null;public DynamicSentinelProperty() {}public DynamicSentinelProperty(T value) {super();this.value = value;}// 添加监听器到集合@Overridepublic void addListener(PropertyListener<T> listener) {listeners.add(listener);// 添加进来后就会初始化规则配置listener.configLoad(value);}// 移除监听器@Overridepublic void removeListener(PropertyListener<T> listener) {listeners.remove(listener);}// 更新值@Overridepublic boolean updateValue(T newValue) {// 如果值没变化, 直接返回if (isEqual(value, newValue)) {return false;}// 如果值发生了变化, 则告知每一个“观察者"value = newValue;for (PropertyListener<T> listener : listeners) {listener.configUpdate(newValue);}return true;}
}

监听器监听的是规则,而规则又是和资源绑定的,因此具体使用时,我们可以创建一个 Map<String resourceName, Set<Rule>> 这样的数据结构来保存资源和规则的关系

  • 当规则首次初始化时调用 SentinelProperty#addListener() 方法注册监听器且进行初始化(初始化的过程就是将资源和规则绑定到 Map 当中)
  • 当规则发生变更时,调用 SentinelProperty#updateValue() 方法将 Map 里的value进行变更

参考资料

通关 Sentinel 流量治理框架 - 编程界的小學生

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/697957.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web3 基金会推出去中心化之声计划:投入高额 DOT 和 KSM ,助力去中心化治理

作者&#xff1a;Web3 Foundation Team 编译&#xff1a;OneBlock 原文&#xff1a;https://medium.com/web3foundation/decentralized-voices-program-93623c27ae43 Web3 基金会为 Polkadot 和 Kusama 创建了去中心化之声计划&#xff08;Decentralized Voices Program&…

云图极速版限时免费活动

产品介绍 云图极速版是针对拥有攻击面管理需求的用户打造的 SaaS 应用&#xff0c;致力于协助用户发现并管理互联网资产攻击面。 实战数据 (2023.11.6 - 2024.2.23) 云图极速版上线 3 个月以来&#xff0c;接入用户 3,563 家&#xff0c;扫描主体 19,961 个&#xff0c;累计发…

SQL注入:网鼎杯2018-unfinish

目录 使用dirmap扫描 使用dirsearch扫描 使用acunetix扫描 爆破后端过滤的字符 绕过限制获取数据 这次的进行SQL注入的靶机是&#xff1a;BUUCTF在线评测 进入到主页面后发现是可以进行登录的&#xff0c;那么我们作为一个安全人员&#xff0c;那肯定不会按照常规的方式来…

js 文件预览 在窗口设置“自定义名称”

1. 最近需要做一个点击表格某一列的标题&#xff0c;预览当前文件的一个小功能。本身功能很简单&#xff0c;点击该标题&#xff0c;预览文件&#xff0c;那么拿到他对应的文件地址&#xff0c;在浏览器打开就行了。 2. 事实如此&#xff0c;使用window.open(url, _blank);就行…

【QT-lineEidte动画效果

QT-lineEidte动画效果 一、演示效果二、核心代码三、下载链接 一、演示效果 二、核心代码 #ifndef DynamicUnderlineLineEdit_H #define DynamicUnderlineLineEdit_H#include <QWidget> #include <QLineEdit> #include <QPainter> #include <QPaintEvent…

HTML5新婚、年会、各种聚会的现场抽奖活动(附源码)

文章目录 1.抽奖平台设计来源1.1 主界面效果1.2 抽奖效果1.3 中奖效果 2.效果和源码配置2.1 动态效果2.2 人员信息配置2.3 奖品信息配置2.4 抽奖音效配置2.5 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/deta…

最长公共前缀【简单】

题目 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀&#xff0c;返回空字符串 ""。 示例如下&#xff1a; 所给提示如下&#xff1a; 1 < strs.length < 2000 < strs[i].length < 200strs[i] 仅由小写英文字母组成 解题 根据…

使用 C++23 协程实现第一个 co_await 同步风格调用接口--Qt计算文件哈希值

C加入了协程 coroutine的特性&#xff0c;一直没有动手实现过。看了网上很多文章&#xff0c;已经了解了协程作为“可被中断和恢复的函数”的一系列特点。在学习过程中&#xff0c;我发现大多数网上的例子&#xff0c;要不就是在main()函数的控制台程序里演示yeild,await, resu…

【动态规划专栏】背包问题:01背包

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

个人博客系列-前端部署-创建框架(4)

项目环境介绍 Vue3 Vite TypeScript 服务器&#xff1a;阿里云contos node版本&#xff1a;v18.18.2 npm版本&#xff1a;v10.2.4 执行下面一行命令&#xff0c;创建vue3框架 npm create vuelatest修改端口&#xff1a;9528&#xff0c; 此步骤可以忽略&#xff08;使用默…

Chrome Captcha自动解决器,如何下载CapSolver

在数字时代&#xff0c;CAPTCHA&#xff08;Completely Automated Public Turing tests to tell Computers and Humans Apart&#xff0c;完全自动区分计算机和人类的公共图灵测试&#xff09;作为一项重要的安全措施&#xff0c;用于保护网站免受自动机器人的攻击。然而&#…

一款跳转警告HTML单页模板源码

一款跳转警告HTML单页模板,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 代码如下 <!DOCTYPE html> <html> <!--QQ沐编程 www.q…

5个精美的wordpress中文企业主题模板

元宇宙WordPress主题模板 简洁大气的元宇宙 Metaverse WordPress主题模板&#xff0c;适合元宇宙行业的企业官网使用。 https://www.jianzhanpress.com/?p3292 职业技术培训WordPress主题模板 简洁大气的职业技术培训WordPress主题&#xff0c;适合用于搭建教育培训公司官方…

【SpringCloudAlibaba系列--OpenFeign组件】OpenFeign的配置、使用与测试以及OpenFeign的负载均衡

步骤一 准备两个服务&#xff0c;provider和consumer 本文使用kotlin语言 provider是服务的提供者&#xff0c;由provider连接数据库 RestController RequiredArgsConstructor RequestMapping("/provider/depart") class DepartController(private val departServ…

磨砂玻璃(毛玻璃)风格的登录页,怎么就流行起来了呢?

拟物风格之后是扁平风格&#xff0c;扁平风格之后是拟态风格&#xff0c;而毛玻璃风格是拟态风格的一种表现形式&#xff0c;如今非常流行了&#xff0c;背后的原因是什么&#xff1f;贝格前端工场为大家详细分析下。 UI风格先后经历了拟物、扁平和拟态三大类&#xff0c;分别…

掼蛋之还贡技巧

掼蛋游戏的规则之一就是进贡和还贡以及抗贡&#xff0c;只要末游没能抗贡&#xff0c;那么就必须把最大的那张牌贡给头游&#xff0c;头游也要选一张牌还给末游。那么我们该如何还贡呢&#xff1f; 一、忌单张 尽量不要还自己的单张&#xff0c;因为自己的数量少&#xff0c;有…

RabbitMQ开启MQTT协议支持

1&#xff09;RabbitMQ启用MQTT插件 rootmq:/# rabbitmq-plugins enable rabbitmq_mqtt Enabling plugins on node rabbitmq: rabbitmq_mqtt The following plugins have been configured:rabbitmq_managementrabbitmq_management_agentrabbitmq_mqttrabbitmq_web_dispatch Ap…

从入门到精通:Spring Boot Alibaba学习网站助你构建高效微服务

介绍&#xff1a;Spring Boot Alibaba是一个基于Spring Boot的微服务开发框架&#xff0c;由阿里巴巴开源&#xff0c;旨在为分布式应用开发提供一站式解决方案。 Spring Boot Alibaba集成了阿里巴巴的微服务实践经验和组件&#xff0c;它是在Spring Cloud项目中孵化的&#xf…

解决Jenkins-2.396启动报错:Failed to start Jenkins Continuous Integration Server.

场景&#xff1a;现有环境已经使用Java 8在运行业务&#xff0c;安装Jenkins后启动报错。 原因&#xff1a;因为Jenkins-2.396 依赖于Java 11 版本才能启动。 解决方法&#xff1a; yum 安装Java11 yum install java-11-openjdk-devel java-11-openjdk 或者二进制安装java11修…

基于生成扩散模型的分子对接程序-DiffDock安装及使用

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、DiffDock是什么&#xff1f;二、DiffDock安装步骤1. 下载2.创建conda环境并安装STEP 1. 创建conda环境并配置STEP 2. 配置ESM和OpenFoldSTEP 3. 检查cuda和pytorch geometric安装STEP 4. 检查p…