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.rhkb.cn/news/262269.html

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

相关文章

UE5 C++ 创建可缩放的相机

一.要将相机设置在Pawn类里 1.在MyPawn头文件里&#xff0c;加上摇臂和相机组件 #include "GameFramework/SpringArmComponent.h" #include "Camera/CameraComponent.h" 2.在Pawm里声明SceneComponet&#xff0c;SpringArmComponent,CameraComponent组件…

OpenAI发布Sora模型,可根据文字生成逼真AI视频

早在2022年11月30日&#xff0c;OpenAI第一次发布人工智能聊天机器人ChatGPT&#xff0c;随后在全世界掀起了人工智能狂潮&#xff0c;颠覆了一个又一个行业。在过去的一年多的时间里&#xff0c;chatGPT的强大功能改变了越来越多人的工作和生活方式&#xff0c;成为了世界上用…

Sora----打破虚实之间的最后一根枷锁----这扇门的背后是人类文明的晟阳还是最后的余晖

目录 一.Sora出道即巅峰 二.为何说Sora是该领域的巨头 三.Sora无敌的背后究竟有怎样先进的处理技术 1.Spacetime Latent Patches 潜变量时空碎片&#xff0c;建构视觉语言系统 2.扩散模型与Diffusion Transformer&#xff0c;组合成强大的信息提取器 3.DiT应用于潜变量时…

安全生产:AI视频智能分析网关V4如何应用在企业安全生产场景中?

随着科技的不断进步&#xff0c;视频智能分析技术在安全生产领域中的应用越来越广泛。这种技术通过计算机视觉和人工智能算法&#xff0c;可以对监控视频进行自动分析和处理&#xff0c;以实现多种功能&#xff0c;如目标检测、行为识别、异常预警等。今天我们以TSINGSEE青犀AI…

深度学习发展里程碑事件2006-2024

2006-2024年&#xff0c;深度学习发展经历众多的里程碑事件&#xff0c;一次次地刺激着人们的神经&#xff0c;带来巨大的兴奋。电影还在继续&#xff0c;好戏在后面&#xff0c;期待…… 2006年 深度信念网络&#xff08;DBNs&#xff09;&#xff1a;Geoffrey Hinton与他的学…

Linux系列讲解 —— 【Vim编辑器】在Ubuntu18.04中安装新版Vim

平时用的电脑系统是Ubuntu18.04&#xff0c;使用apt安装VIM的默认版本是8.0。如果想要安装新版的Vim编辑器&#xff0c;只能下载Vim源码后进行编译安装。 目录 1. 下载Vim源码2. 编译3. 安装4. 遇到的问题4.1 打开vim后&#xff0c;文本开头有乱码现象。4.2 在Vim编辑器中&…

宏观视角下的浏览器

宏观视角下的浏览器 Chrome架构线程 VS 进程进程架构 TCP协议IP&#xff1a;把数据包送达目的主机UDP&#xff1a;把数据包送达应用程序TCP&#xff1a;把数据完整地送达应用程序 HTTP请求流程构建请求查找缓存准备IP地址和端口等待TCP队列建立TCP连接发送HTTP请求 服务器端处理…

Apache服务

目录 引言 一、常见的http服务程序 &#xff08;一&#xff09;lls &#xff08;二&#xff09;nginx &#xff08;三&#xff09;Apache &#xff08;四&#xff09;Tomcat 二、Apache特点 三、Apache服务的安装 &#xff08;一&#xff09;yum安装及配置文件 1.配置…

#11vue3中使用el-dialog展示与关闭交由父组件控制的写法

目录 1、法一&#xff1a;通过defineEmits调用父组件方法 1.1、父组件 1.2、子组件&#xff08;CONTENT&#xff09; 2、法二&#xff1a;通过difineExpose暴露子组件属性 2.1、父组件 2.2、子组件&#xff08;Child&#xff09; 1、法一&#xff1a;通过defineEmits调用…

WordPress后台自定义登录和管理页面插件Admin Customizer

WordPress默认的后台登录页面和管理员&#xff0c;很多站长都想去掉或修改一些自己不喜欢的功能&#xff0c;比如登录页和管理页的主题样式、后台左侧菜单栏的某些菜单、仪表盘的一些功能、后台页眉页脚某些小细节等等。这里boke112百科推荐这款可以让我们轻松自定义后台登录页…

【Git】:标签功能

标签功能 一.标签操作二.推送远程标签 标签 tag &#xff0c;可以简单的理解为是对某次commit的⼀个标识&#xff0c;相当于起了⼀个别名。例如&#xff0c;在项⽬发布某个版本的时候&#xff0c;针对最后⼀次commit起⼀个v1.0这样的标签来标识⾥程碑的意义。这有什么⽤呢&…

计算机网络基础之计算机网络组成与分类

计算机网络基础 计算机网络是计算机技术与通信技术发展相结合的产物&#xff0c;并在用户需求的促进下得到进一步的发展。通信技术为计算机之间的数据传输和交换提供了必需的手段&#xff0c;而计算机技术又渗透到了通信领域&#xff0c;提高了通信网络的性能。 计算机网络的…

mysql 自定义函数create function

方便后续查询&#xff0c;做以下记录&#xff1b; 自定义函数是一种与存储过程十分相似的过程式数据库对象&#xff0c; 它与存储过程一样&#xff0c;都是由 SQL 语句和过程式语句组成的代码片段&#xff0c;并且可以被应用程序和其他 SQL 语句调用。 自定义函数与存储过程之间…

10.Halcon形态学膨胀,腐蚀,开运算,闭运算

膨胀:对边界点进行扩充,填充空洞&#xff0c;使边界向外部扩张的过程。 腐蚀:消除物体边界点,使边界向内部收缩的过程,把小于结构元素的物体去除掉. 开运算: 先腐蚀后膨胀的过程称为开运算。 作用 : 去除孤立的小点,毛刺,消除小物体,平滑较大物体边界,同时不改变其面积. 闭运…

【Spring】Spring MVC

目 录 一.什么是 Spring MVC&#xff1f;1.MVC 定义2.MVC 和 Spring MVC 的关系 二.为什么要学 Spring MVC&#xff1f;三.怎么学 Spring MVC&#xff1f;1.Spring MVC 创建和连接综上连接方式&#xff1a; 2.获取参数1.传递单个参数2.获取多个参数3.获取对象4.获取表单参数5.接…

Day17_集合与数据结构(链表,栈和队列,Map,Collections工具类,二叉树,哈希表)

文章目录 Day17 集合与数据结构学习目标1 数据结构2 动态数组2.1 动态数组的特点2.2 自定义动态数组2.3 ArrayList与Vector的区别&#xff1f;2.4 ArrayList部分源码分析1、JDK1.6构造器2、JDK1.7构造器3、JDK1.8构造器4、添加与扩容5、删除元素6、get/set元素7、查询元素8、迭…

论文学习 BioNeRF: Biologically Plausible Neural Radiance Fields for View Synthesis

论文学习 BioNeRF: Biologically Plausible Neural Radiance Fields for View Synthesis 前言简介NeRF介绍BioNeRF位置编码提取感知过滤记忆更新纹理推断损失函数 量化验证总结 前言 虽然我不应该再看NeRF相关的东西了&#xff0c;但是我还是觉得这个论文的题目很有意思&#…

ChatGPT 是什么

文章目录 一、ChatGPT 是什么二、ChatGPT的发明者三、ChatGPT的运作方式四、ChatGPT的技术五、ChatGPT的优势六、ChatGPT的局限性七、ChatGPT的应用八、ChatGPT的未来九、总结 一、ChatGPT 是什么 OpenAI的ChatGPT&#xff0c;即Chat Generative Pre-Trained Transformer&…

Sora来袭,蹭一波AI热潮|GPT · 重点梳理 -- 什么是ChatGPT,能干嘛,怎么用?

课程安排 学习内容 第一章 2024年AI领域最新技术 1.OpenAI新模型-GPT-5 2.谷歌新模型-Gemini Ultra 3.Meta新模型-LLama3 4.科大讯飞-星火认知 5.百度-文心一言 6.MoonshotAI-Kimi 7.智谱AI-GLM-4 第二章 OpenAI开发者大会后GPT最新技术 1.最新大模型GPT-4 Turbo详细介绍…

(done) 什么是特征值和特征向量?如何求特征值的特征向量 ?如何判断一个矩阵能否相似对角化?

什么是齐次方程&#xff1f; https://blog.csdn.net/shimly123456/article/details/136198159 行列式和是否有解的关系&#xff1f; https://blog.csdn.net/shimly123456/article/details/136198215 特征值和特征向量 参考视频&#xff1a;https://www.bilibili.com/video/BV…