摘要: 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相关推荐

  1. 实践 | Sentinel 扩展性设计

    Sentinel 提供多样的 SPI 接口用于提供扩展的能力.用户可以在用同一个 sentinel-core 的基础上自行扩展接口实现,从而可以方便地给 Sentinel 添加自定义的逻辑. 初始化逻 ...

  2. 面试被问mysql扩展性设计相关的点,你知道该如何回答吗

    面试被问mysql扩展性设计相关的点,你知道该如何回答吗 什么是扩展性 横向扩展(Scale Out) 和纵向扩展(Scale Up)区别 横向扩展 纵向扩展 事务相关性最小化原则 解决方案 敲黑板. ...

  3. Mysql 扩展性设计之数据切分、那么数据切分后会带来哪些问题呢?比如分布式事务、数据的一致性、垂直切分和水平切分应用场景

    Mysql 扩展性设计之数据切分.那么数据切分后会带来哪些问题呢?比如分布式事务.数据的一致性.垂直切分和水平切分应用场景 前言.什么是数据切分 垂直(纵向)切分.水平(横向)切分.他们各自的特点 垂 ...

  4. SAP S/4HANA Customer Management(CRM)模块的扩展性设计

    标题:One order extensibility in S4HANA for Customer Management In SAP CRM we use Application Enhanceme ...

  5. Mysql 扩展性设计之Replication,在Mysql具有很相当重要的位置,主从、主主从,你了解他们的背后逻辑吗

    前言 什么是Replication,干什么用的呢 Replication是怎么个工作的呢,背后的逻辑或原理是什么样子的 Replication 整体介绍 Replication 线程总结 敲黑板,划重 ...

  6. 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 ...

  7. .NET 设计规范--.NET约定、惯用法与模式--6.为扩展性而设计

    6.1 扩展机制 6.1.1 非密封类 密封类即无法派生子类,也无法扩展.与此相反,非密封类可以派生子类进行扩展  //string cannot be inherited from public s ...

  8. kicad 排针_xconch: 神奇海螺,是时候该结束开发板裸奔的时代了。采用堆叠设计,拥有漂亮外观及超强扩展性。一款完全开源的结构及通用硬件扩展平台,旨在大家能更欢乐的DIY。...

    神奇海螺 简介 是时候该结束开发板裸奔的时代了.采用堆叠设计,拥有漂亮外观及超强扩展性.一款完全开源的结构及通用硬件扩展平台,旨在大家能更欢乐的DIY. 名称的由来 神奇海螺,源自网友word天lym ...

  9. 如何构建和设计高扩展性系统

    主要内容 本书从多个方面围绕高扩展性提出了50条建议,一个高扩展性的网站会随着业务的发展.用户的增加,自由的扩展架构,从而轻松的应付网站的快速发展.下面看看本书的具体内容: 化简方程 1 不要过度的设 ...

最新文章

  1. docker 部署nginx
  2. 数据结构之并查集Union-Find Sets
  3. gdb+pwndbg使用初探
  4. RBPsuite RNA-蛋白质结合位点预测工具使用指南
  5. boost::tokenizer模块相关的测试程序
  6. python源码只有编译成二进制_Python源码包和二进制包(包含打包过程细节讲解)...
  7. 基于JQuery实现滚动到页面底端时自动加载更多信息
  8. JavaScript操作表格进行拖拽排序
  9. win7下oracle10g安装,专门针对win7下oracle10g安装的详解
  10. IDP:云原生的“Jupyter”,让算法团队更高产
  11. Unity线程安全:CompareBaseObjectsInternal can only be called from the main thread
  12. 关于android RTP驱动的问题
  13. 英文分词的算法和原理
  14. 日历查询---在线阴阳历转换器
  15. EasyOCR,识别图片中的文字真的so easy
  16. 暗影精灵7安装Ubuntu双系统、RTX3060 Nvidia 驱动及搭建深度学习环境
  17. 100以内的质数及100以内质数的和
  18. 毕业设计微信小程序选题
  19. 计算机专业转正定级,大学生毕业一年以后千万别忘了转正定级(转自小志)
  20. SSD-6D: Making RGB-Based 3D Detection and 6D Pose Estimation Great Again—2017(笔记)

热门文章

  1. WLC-生成CSR操作
  2. Javaweb学习笔记——使用Jdom解析xml
  3. 快速创建UI控件的 方法 ,值得总结1
  4. cognos report上钻下钻报表处理方法(2)
  5. python---之suplot和suplots的区别
  6. Tensorflow随笔——命令行参数
  7. Tensorflow简单使用(一)
  8. python 词云 fontpath_Python酷炫词云图原来可以这么玩?
  9. python web开发框架 支持windows_基于Python的Web开发框架研究_曾浩
  10. python 相对导入_Python相对导入机制详解