廣告
请使用 http://www.luhui.net 網址高速訪問本站,歡迎關注微信公衆賬号:guanfu8 平台長期發布海量社科數據, 本站QQ交流群:84142868 探讨人文理想,共謀和諧世界!
黄金广告位招租,投放热线15900718107,13386070835 详情查看=》   鲁之虺:“  上网就是搜索,生活就是分类,科技服务大众,信息引领生活,地方分类站长,开启您的事业之旅。生活分类信息整体提供商:http://huike.luhui.net”。
×

鲁虺繁体中文社区

 找回密碼
 立即註冊
廣告

 

查看: 58|回復: 0

[应用软件] 实践 | Sentinel 扩展性设计

[複製鏈接]
發表於 2018-11-7 09:27:38 | 顯示全部樓層 |閱讀模式
廣告
搜索看看︰实践 | Sentinel 扩展性设计
廣告
摘要: 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 添加自定义的功能。

实践 | Sentinel 扩展性设计

实践 | Sentinel 扩展性设计

比如我们想要在请求 pass 后记录当前的 context 和资源信息,则可以实现一个简单的 slot:
  1. 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):
  1. 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 的类名即可生效:
  1. # Custom slot chain buildercom.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 添加自定义的命令。
原文链接
本文为云栖社区原创内容,未经允许不得转载。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/31545802/viewspace-2217565/,如需转载,请注明出处,否则将追究法律责任。
廣告
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

广告

廣告
操作系统 Fuchsia OS  |Microsoft Windows  |Android  |Chrome OS  |Novell  |Linux  |Mac OS X  |Unix  |FreeBSD  | Ubuntu
廣告

QQ|關于我們|聯繫我們|合作共赢|免責聲明|隐私条款|Archiver|手機版|拘留所|申請友鏈|付款方式|鲁虺繁体中文社区 |贊助我們 -

GMT+8, 2026-8-29 15:28 , Processed in 0.181010 second(s), 13 queries , WinCache On.

Powered by HCMS 1.0

© 2004-01-11 鲁虺文化网 版权所有

快速回復 返回頂部 返回列表