阿里Sentinel源码解析责任链模式的应用

JavaEdge

共 1347字,需浏览 3分钟

 ·

2020-12-20 11:52


  点击上方“JavaEdge”,关注公众号

设为“星标”,好文章不错过!

NodeSelectorSlot


NodeSelectorSlot:链中处理的第一个节点

责任链实例和 resource name 相关,和线程无关,所以当处理同一个resource 时,会进入同一 NodeSelectorSlot 实例。
所以该节点代码主要处理:不同的 context name,同一 resource name 的场景。

如下它们都处理同一 resource(“getUserInfo” resource),但它们入口 context 不一。

结合前面的那棵树,可得如下树

清楚 NodeSelectorSlot 实例和 resource 一一对应即可。


ClusterBuilderSlot


主要创建 ClusterNode

该类处理后

每个 resource 对应一个 ClusterNode 实例,若不存在,就创建一个新实例。



统计意义


数据统计的。比如 getUserInfo 接口,由于从不同的 context name 开启调用链,它有多个 DefaultNode 实例,但只有一个 ClusterNode,通过该实例,即可知道该接口的 QPS。

此类还处理了 origin 不是默认值场景:
origin 代表调用方标识,如 application-a, application-b。

当设置了 origin,会生成一个 StatisticsNode 实例,挂在 ClusterNode。

改下案例代码

getUserInfo 接收到来自 application-a 和 application-b 两个应用的请求,那么树会变成下面这样:

它的作用是用来统计从 application-a 过来的访问 getUserInfo 这个接口的信息。目前该信息在 dashboard 不展示,毕竟没啥用。

LogSlot


直接 fire 出去了,即先处理责任链后面的节点,若它们抛 BlockException,才处理。

StatisticSlot




作用


数据统计。



原理


先 fire,等后面的节点处理完毕后,再进行统计数据。

为何这样设计?
因为后面节点是做控制,执行时可能正常通过,也可能抛 BlockException。

  • QPS 统计
    使用滑动窗口

  • 线程并发的统计
    使用 LongAdder

接下来几个 Slot 需要通过 dashboard 进行开启,因为需要配置规则。

也可以硬编码规则到代码中。但是要调整数值就比较麻烦,每次都要改代码。


往期推荐


大厂如何解决数值精度/舍入/溢出问题

大厂数据库事务实践-事务生效就能保证正确回滚?

线上问题事迹(一)数据库事务居然都没生效?

硬核干货:HTTP超时、重复请求必见坑点及解决方案

给大忙人们看的Java NIO教程之Channel





目前交流群已有 800+人,旨在促进技术交流,可关注公众号添加笔者微信邀请进群


喜欢文章,点个“在看、点赞、分享”素质三连支持一下~

浏览 33
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报