阿里限流中间件Sentinel 原理-如何为系统设置扩展点

Sentinel 系列教程,现已上传到 github 和 gitee 中,并会长期更新 Sentinel 中的知识点和实践经验,我希望用更简单的demo和更易懂的图文描述慢慢揭开 Sentinel 的面纱,欢迎大家加入一起学习,为 Sentinel 的发展做出一点贡献:

一个好的框架有一个很重要的特性就是扩展性要好,不能把系统写死,后期想要新增功能时,可以通过预留的扩展点进行扩展,而不是去修改原来的代码。

本篇文章我就来跟大家分享下 Sentinel 在扩展性这块是怎么做的,都有哪些扩展点。

一、模块设计

第一点从模块设计上,Sentinel 就充分考虑了扩展性,Sentinel 核心的功能其实就在 sentinel-core 模块中,要想在自己的系统中使用 Sentinel 最少只需要引入这一个依赖就够了。其他的都是为了框架的易用性和高可用性等做的扩展。

我们来看下 Sentinel 中都有哪些扩展的模块:

  • sentinel-dashboard:一个通过 spring boot 实现的 web 应用,相当于是 Sentinel 的 OPS 工具,通过 dashboard 我们可以更方便的对规则进行调整、查询实时统计信息等,但是这并不是必须的,没有 dashboard 我们也能使用 Sentinel,甚至我们可以通过 Sentinel 提供的 api 来实现自己的 dashboard。
  • sentinel-transport:一个 sentinel-core 和 sentinel-dashboard 通讯的桥梁,如果我们的应用接入了 Sentinel,并且也想通过 dashboard 来管理的话,那就需要引入 sentinel-transport 模块。
  • sentinel-extension:一个 Sentinel 的扩展模块,主要是实现了规则的动态更新和持久化。另外热点参数限流也在这里实现的,除此之外注解的相关实现也是在这个模块中。
  • sentinel-adapter:一个适配器的扩展,通过适配器可以很方便的为其他框架进行 Sentinel 的集成。
  • sentinel-cluster:集群限流的扩展,通过引入这个模块可以在集群环境中使用 Sentinel。

除了 sentinel-core 之外,其他的模块基本上都是围绕着 sentinel-core 做了一些扩展,而且各个模块之间没有强耦合,是可插拔的,以下这张图可以简单的描述这个关系:

二、系统初始化

Sentinel 为我们提供了一个 InitFunc 接口来做系统的初始化工作,如果我们想要实现在系统初始化时就执行的逻辑,可以实现 InitFunc 接口。

目前 Sentinel 中有一些实现了 InitFunc 的类:

主要实现了以下这些系统初始化的工作:

  • CommandCenter 的初始化
  • HeartBeat 的初始化与心跳发送
  • 集群服务端和客户端的初始化
  • 热点限流中 StatisticSlot 回调的初始化

并且我们我们可以通过 @InitOrder 注解来指定 InitFunc 执行的顺序,order 的值越小越先执行。

InitFunc 是在首次调用 SphU.entry(KEY) 方法时触发的,注册的初始化函数会依次执行。

如果你不想把初始化的工作延后到第一次调用时触发,可以手动调用 InitExecutor.doInit() 函数,重复调用只会执行一次。

三、规则持久化

限流降级的规则,是通过调用 loadRules 方法加载进内存中的,而实际使用中,我们必须要对规则进行持久化,因为不进行持久化的话规则将会在系统重启时丢失。

那么 Sentinel 是如何做到,在扩展了动态规则加载的方法时,又不影响原先正常的规则加载的呢?我们看一下 FlowRuleManager 的 loadRules 方式就知道了:

实际上是通过 DynamicSentinelProperty 的 updateValue 方法来动态更新规则的。

那么我们只需要在持久化的规则发生变更时,通过触发 SentinelProperty 的 updateValue 方法把更新后的规则注入进去就可以了。目前 SentinelProperty 有默认的实现,这一块我们不需要进行扩展,我们只需要实现监听每种持久化的数据源在发生数据变更时的事件,当接收到最新的数据时将它 update 进 FlowRuleManager 中即可。

所以我们需要抽象出读数据源和写数据源的两个接口:

  • ReadableDataSource:读数据源负责监听持久化的数据源的变更,在接收到变更事件时将最新的数据更新
  • WritableDataSource:写数据源负责将变更后的规则写入到持久化的数据源中

目前系统中只有一种文件数据源实现了 WritableDataSource 接口,其他的数据源只实现了 ReadableDataSource 接口。

四、网络通讯

sentinel-transport 模块中的功能基本上都是网络通讯相关的,而我们有很多的网络协议:http、tcp等,所以网络通讯这块肯定也要有可扩展的能力。目前 sentinel-transport-common 模块中抽象了3个接口作为扩展点:

  • CommandCenter:该接口主要用来在 sentinel-core 中启动一个可以对外提供 api 接口的服务端,Sentinel 中默认有两个实现,分别是 http 和 netty。但是官方默认推荐的是使用 http 的实现。
  • CommandHandler:该接口主要是用来处理接收到的请求的,不同的请求有不同的 handler 类来进行处理,我们可以实现我们自己的 CommandHandler 并注册到 SPI 配置文件中来为 CommandCenter 添加自定义的命令。
  • HeartbeatSender:该接口主要是为 sentinel-core 用来向 sentinel-dashboard 发送心跳的,默认也有两个实现,分别是 http 和 netty。

五、Slot链

Sentinel 内部是通过一系列的 slot 组成的 slot chain 来完成各种功能的,包括构建调用链、调用数据统计、规则检查等,各个 slot 之间的顺序非常重要。

Sentinel 将 SlotChainBuilder 作为 SPI 接口进行扩展,使得 Slot Chain 具备了扩展的能力。我们可以自行加入自定义的 slot 并编排 slot 间的顺序,从而可以给 Sentinel 添加自定义的功能。

六、StatisticSlot回调

之前 StatisticSlot 里面包含了太多的逻辑,像普通 qps 和 热点参数 qps 的 addPass/addBlock 等逻辑统计都在 StatisticSlot 里面,各个逻辑都杂糅在一起,不利于扩展。

因此有必要为 StatisticSlot 抽象出一系列的 callback,从而使 StatisticSlot 具备基本的扩展能力,并将一系列的逻辑从 StatisticSlot 解耦出来,目前 Sentinel 提供了两种 callback:

  • ProcessorSlotEntryCallback
    包含 onPass 和 onBlocked 两个回调函数,分别对应着请求在 pass 和 blocked 的时候执行。

  • ProcessorSlotExitCallback
    包含 onExit 回调函数,对应着请求在 exit 的时候执行。

只需将实现的 callback 注册到 StatisticSlotCallbackRegistry 即可生效。

欢迎大家加入粉丝群:963944895,群内免费分享Spring框架、Mybatis框架SpringBoot框架、SpringMVC框架、SpringCloud微服务、Dubbo框架、Redis缓存、RabbitMq消息、JVM调优、Tomcat容器、MySQL数据库教学视频及架构学习思维导图

写在最后:

既然看到这里了,觉得笔者写的还不错的就点个赞,加个关注呗!点关注,不迷路,持续更新!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,809评论 6 513
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,189评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 167,290评论 0 359
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,399评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,425评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,116评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,710评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,629评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,155评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,261评论 3 339
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,399评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,068评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,758评论 3 332
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,252评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,381评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,747评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,402评论 2 358

推荐阅读更多精彩内容