阿里Sentinel源码解析责任链模式的应用
点击上方“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 进行开启,因为需要配置规则。
也可以硬编码规则到代码中。但是要调整数值就比较麻烦,每次都要改代码。
往期推荐
目前交流群已有 800+人,旨在促进技术交流,可关注公众号添加笔者微信邀请进群
喜欢文章,点个“在看、点赞、分享”素质三连支持一下~