实践 | Sentinel 扩展性设计 1
摘要: Sentinel 提供多样的 SPI 接口用于提供扩展的能力。用户可以在用同一个 sentinel-core 的基础上自行扩展接口实现,从而可以方便地给 Sentinel 添加自定义的逻辑。 初始化逻辑扩展机制 为了统一初始化的流程,我们抽象出了 InitFunc 接口代表 Sentinel 的一些初始化逻辑,如: 注册动态规则源(示例) 注册 StatisticSlot 回调函数(示例) 启动 Command Center 初始化心跳发送 我们可以通过注解设置 InitFunc 执行的优先级。
Sentinel 提供多样的 SPI 接口用于提供扩展的能力。用户可以在用同一个 sentinel-core 的基础上自行扩展接口实现,从而可以方便地给 Sentinel 添加自定义的逻辑。
初始化逻辑扩展机制
为了统一初始化的流程,我们抽象出了 InitFunc 接口代表 Sentinel 的一些初始化逻辑,如:
注册动态规则源(示例)
注册 StatisticSlot 回调函数(示例)
启动 Command Center
初始化心跳发送
我们可以通过注解设置 InitFunc 执行的优先级。当应用首次访问资源时,注册的初始化函数会依次执行。若希望手动提前触发初始化,可以在相应的位置(如 Spring Bean)调用 InitExecutor.doInit() 函数,重复调用只会执行一次。
Slot Chain 扩展机制
Sentinel 内部是通过一系列的 slot 组成的 slot chain 来完成各种功能的,包括构建调用链、调用数据统计、规则检查等。各个 slot 之间的顺序非常重要。Sentinel 将 SlotChainBuilder 作为 SPI 接口进行扩展,使得 Slot Chain 具备了扩展的能力。用户可以自行加入自定义的 slot 并编排 slot 间的顺序,从而可以给 Sentinel 添加自定义的功能。
比如我们想要在请求 pass 后记录当前的 context 和资源信息,则可以实现一个简单的 slot:
public class DemoSlot extends AbstractLinkedProcessorSlot<DefaultNode> {
@Override
public void entry(Context context, ResourceWrapper resourceWrapper, DefaultNode node, int count, Object... args)throws Throwable {System.out.println("Current context: " + context.getName());System.out.println("Current entry resource: " + context.getCurEntry().getResourceWrapper().getName());fireEntry(context, resourceWrapper, node, count, args);
}@Override
public void exit(Context context, ResourceWrapper resourceWrapper, int count, Object... args) {System.out.println("Exiting for entry on DemoSlot: " + context.getCurEntry().getResourceWrapper().getName());fireExit(context, resourceWrapper, count, args);
}
}
然后实现一个 SlotChainBuilder,可以在 DefaultSlotChainBuilder 的基础上将我们新的 slot 添加到链的尾部(当然也可以不用 DefaultSlotChainBuilder,自由组合现有的 slot):
package com.alibaba.csp.sentinel.demo.slot;
public class DemoSlotChainBuilder implements SlotChainBuilder {
@Override
public ProcessorSlotChain build() {ProcessorSlotChain chain = new DefaultSlotChainBuilder().build();chain.addLast(new DemoSlot());return chain;
}
}
最后在 resources/META-INF/services 目录下的 SPI 配置文件 com.alibaba.csp.sentinel.slotchain.SlotChainBuilder 中添加上实现的 SlotChainBuilder 的类名即可生效:
Custom slot chain builder
com.alibaba.csp.sentinel.demo.slot.DemoSlotChainBuilder
Sentinel 的热点限流模块就是利用了 Slot Chain 的扩展机制来将热点限流功能添加到原有的功能链中。
StatisticSlot Callback
之前 StatisticSlot 里面包含了太多的逻辑,像普通 QPS 和 热点参数 QPS 的 addPass/addBlock 等逻辑统计都在 StatisticSlot 里面,各个逻辑都杂糅在一起,不利于扩展。因此有必要为 StatisticSlot 抽象出一系列的 callback,从而使 StatisticSlot 具备基本的扩展能力,并将一系列的逻辑从 StatisticSlot 解耦出来,更为清晰。目前 Sentinel 提供了两种 callback:
ProcessorSlotEntryCallback:包含 onPass 和 onBlocked 两个回调函数,分别对应请求通过 StatisticSlot 和请求被 blocked 的时候执行。
ProcessorSlotExitCallback:包含 onExit 回调函数,当请求经 StatisticSlot exit 的时候执行。
用户只需将实现的 callback 注册到 StatisticSlotCallbackRegistry 即可生效。
动态规则源
Sentinel 的 动态规则数据源 用于从外部的存储中读取及写入规则。Sentinel 将动态规则数据源划分为两种类型:读数据源(ReadableDataSource)和写数据源(WritableDataSource),从而使不同类型的数据源职责更加清晰:
读数据源仅负责监听或轮询读取远程存储的变更。
写数据源仅负责将规则变更写入到规则源中。
我们只需要自己实现动态规则源,然后将其注册至对应的 RuleManager 上,这样就可以实时地配置规则并进行拉取/推送了。注册动态规则源时可以借助 Sentinel 的 InitFunc SPI 在初始化时自动注册。
Transport 扩展机制
CommandCenter 可扩展:用户可以用不同的网络协议或不同的库来实现 Transport API Server。
HeartbeatSender 可扩展:用户可以用不同的网络协议和心跳策略来实现心跳发送(上报到控制台)。
CommandHandler 可扩展:用户可以自行实现 CommandHandler 并注册到 SPI 配置文件中来为 CommandCenter 添加自定义的命令。
实践 | Sentinel 扩展性设计 1相关推荐
- 实践 | Sentinel 扩展性设计
Sentinel 提供多样的 SPI 接口用于提供扩展的能力.用户可以在用同一个 sentinel-core 的基础上自行扩展接口实现,从而可以方便地给 Sentinel 添加自定义的逻辑. 初始化逻 ...
- 面试被问mysql扩展性设计相关的点,你知道该如何回答吗
面试被问mysql扩展性设计相关的点,你知道该如何回答吗 什么是扩展性 横向扩展(Scale Out) 和纵向扩展(Scale Up)区别 横向扩展 纵向扩展 事务相关性最小化原则 解决方案 敲黑板. ...
- Mysql 扩展性设计之数据切分、那么数据切分后会带来哪些问题呢?比如分布式事务、数据的一致性、垂直切分和水平切分应用场景
Mysql 扩展性设计之数据切分.那么数据切分后会带来哪些问题呢?比如分布式事务.数据的一致性.垂直切分和水平切分应用场景 前言.什么是数据切分 垂直(纵向)切分.水平(横向)切分.他们各自的特点 垂 ...
- SAP S/4HANA Customer Management(CRM)模块的扩展性设计
标题:One order extensibility in S4HANA for Customer Management In SAP CRM we use Application Enhanceme ...
- Mysql 扩展性设计之Replication,在Mysql具有很相当重要的位置,主从、主主从,你了解他们的背后逻辑吗
前言 什么是Replication,干什么用的呢 Replication是怎么个工作的呢,背后的逻辑或原理是什么样子的 Replication 整体介绍 Replication 线程总结 敲黑板,划重 ...
- mysql双倍扩容_mysql扩展性架构实践N库到2N 库的扩容,2变4、4变8
mysql扩展性架构实践N库到2N 库的扩容,2变4.4变8 http://geek.csdn.net/news/detail/52070 58同城 沈剑 http://www.99cankao.co ...
- .NET 设计规范--.NET约定、惯用法与模式--6.为扩展性而设计
6.1 扩展机制 6.1.1 非密封类 密封类即无法派生子类,也无法扩展.与此相反,非密封类可以派生子类进行扩展 //string cannot be inherited from public s ...
- kicad 排针_xconch: 神奇海螺,是时候该结束开发板裸奔的时代了。采用堆叠设计,拥有漂亮外观及超强扩展性。一款完全开源的结构及通用硬件扩展平台,旨在大家能更欢乐的DIY。...
神奇海螺 简介 是时候该结束开发板裸奔的时代了.采用堆叠设计,拥有漂亮外观及超强扩展性.一款完全开源的结构及通用硬件扩展平台,旨在大家能更欢乐的DIY. 名称的由来 神奇海螺,源自网友word天lym ...
- 如何构建和设计高扩展性系统
主要内容 本书从多个方面围绕高扩展性提出了50条建议,一个高扩展性的网站会随着业务的发展.用户的增加,自由的扩展架构,从而轻松的应付网站的快速发展.下面看看本书的具体内容: 化简方程 1 不要过度的设 ...
最新文章
- docker 部署nginx
- 数据结构之并查集Union-Find Sets
- gdb+pwndbg使用初探
- RBPsuite RNA-蛋白质结合位点预测工具使用指南
- boost::tokenizer模块相关的测试程序
- python源码只有编译成二进制_Python源码包和二进制包(包含打包过程细节讲解)...
- 基于JQuery实现滚动到页面底端时自动加载更多信息
- JavaScript操作表格进行拖拽排序
- win7下oracle10g安装,专门针对win7下oracle10g安装的详解
- IDP:云原生的“Jupyter”,让算法团队更高产
- Unity线程安全:CompareBaseObjectsInternal can only be called from the main thread
- 关于android RTP驱动的问题
- 英文分词的算法和原理
- 日历查询---在线阴阳历转换器
- EasyOCR,识别图片中的文字真的so easy
- 暗影精灵7安装Ubuntu双系统、RTX3060 Nvidia 驱动及搭建深度学习环境
- 100以内的质数及100以内质数的和
- 毕业设计微信小程序选题
- 计算机专业转正定级,大学生毕业一年以后千万别忘了转正定级(转自小志)
- SSD-6D: Making RGB-Based 3D Detection and 6D Pose Estimation Great Again—2017(笔记)
热门文章
- WLC-生成CSR操作
- Javaweb学习笔记——使用Jdom解析xml
- 快速创建UI控件的 方法 ,值得总结1
- cognos report上钻下钻报表处理方法(2)
- python---之suplot和suplots的区别
- Tensorflow随笔——命令行参数
- Tensorflow简单使用(一)
- python 词云 fontpath_Python酷炫词云图原来可以这么玩?
- python web开发框架 支持windows_基于Python的Web开发框架研究_曾浩
- python 相对导入_Python相对导入机制详解