这篇文章主要介绍“Sentinel扩展机制是什么”,在日常操作中,相信很多人在Sentinel扩展机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Sentinel扩展机制是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
Sentinel 提供多样的 SPI 接口用于提供扩展的能力。用户可以在用同一个 sentinel-core 的基础上自行扩展接口实现,从而可以方便地给 Sentinel 添加自定义的逻辑。
为了统一初始化的流程,我们抽象出了
InitFunc
接口代表 Sentinel 的一些初始化逻辑,如:
注册动态规则源( 示例 )
注册 StatisticSlot 回调函数( 示例 )
启动 Command Center
初始化心跳发送
我们可以通过注解设置
InitFunc
执行的优先级。当应用首次访问资源时,注册的初始化函数会依次执行。若希望手动提前触发初始化,可以在相应的位置(如 Spring Bean)调用
InitExecutor.doInit()
函数,重复调用只会执行一次。
Sentinel 内部是通过一系列的 slot 组成的 slot chain 来完成各种功能的,包括构建调用链、调用数据统计、规则检查等。各个 slot 之间的顺序非常重要。Sentinel 将
SlotChainBuilder
作为 SPI 接口进行扩展,使得 Slot Chain 具备了扩展的能力。用户可以自行加入自定义的 slot 并编排 slot 间的顺序,从而可以给 Sentinel 添加自定义的功能。
cdn.nlark.com/lark/0/2018/png/47688/1539165202133-64062dc7-88f1-45ac-8177-c29cd9ca0e9d.png">
比如我们想要在请求 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 buildercom.alibaba.csp.sentinel.demo.slot.DemoSlotChainBuilder
Sentinel 的热点限流模块就是利用了 Slot Chain 的扩展机制来将热点限流功能添加到原有的功能链中。
之前
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 在初始化时自动注册。
CommandCenter 可扩展:用户可以用不同的网络协议或不同的库来实现 Transport API Server。
HeartbeatSender 可扩展:用户可以用不同的网络协议和心跳策略来实现心跳发送(上报到控制台)。
CommandHandler 可扩展:用户可以自行实现
CommandHandler
并注册到 SPI 配置文件中来为 CommandCenter 添加自定义的命令。
到此,关于“Sentinel扩展机制是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。