阿里Sentinel源码解析责任链模式的应用
共 1347字,需浏览 3分钟
· 2020-12-20
点击上方“JavaEdge”,关注公众号
![](https://filescdn.proginn.com/472840fedd113bea9ae739f2b74127d4/c48a7bc037cd4d011a218a7ba0cbdde5.webp)
NodeSelectorSlot
![](https://filescdn.proginn.com/23ddeb2848575f368534d2f1141aada5/f6d4db006345ba41b4648d6bd53843bc.webp)
NodeSelectorSlot:链中处理的第一个节点
责任链实例和 resource name 相关,和线程无关,所以当处理同一个resource 时,会进入同一 NodeSelectorSlot 实例。
所以该节点代码主要处理:不同的 context name,同一 resource name 的场景。
如下它们都处理同一 resource(“getUserInfo” resource),但它们入口 context 不一。
结合前面的那棵树,可得如下树
清楚 NodeSelectorSlot 实例和 resource 一一对应即可。
![](https://filescdn.proginn.com/472840fedd113bea9ae739f2b74127d4/c48a7bc037cd4d011a218a7ba0cbdde5.webp)
ClusterBuilderSlot
![](https://filescdn.proginn.com/23ddeb2848575f368534d2f1141aada5/f6d4db006345ba41b4648d6bd53843bc.webp)
主要创建 ClusterNode
该类处理后
每个 resource 对应一个 ClusterNode 实例,若不存在,就创建一个新实例。
统计意义
![](https://filescdn.proginn.com/e8cad7fc5b45e2095f8841b939e32ba8/0a3bdd27e1e05204e3115847c168d9e6.webp)
数据统计的。比如 getUserInfo 接口,由于从不同的 context name 开启调用链,它有多个 DefaultNode 实例,但只有一个 ClusterNode,通过该实例,即可知道该接口的 QPS。
此类还处理了 origin 不是默认值场景:
origin 代表调用方标识,如 application-a, application-b。
当设置了 origin,会生成一个 StatisticsNode 实例,挂在 ClusterNode。
改下案例代码
getUserInfo 接收到来自 application-a 和 application-b 两个应用的请求,那么树会变成下面这样:
它的作用是用来统计从 application-a 过来的访问 getUserInfo 这个接口的信息。目前该信息在 dashboard 不展示,毕竟没啥用。
![](https://filescdn.proginn.com/472840fedd113bea9ae739f2b74127d4/c48a7bc037cd4d011a218a7ba0cbdde5.webp)
LogSlot
![](https://filescdn.proginn.com/23ddeb2848575f368534d2f1141aada5/f6d4db006345ba41b4648d6bd53843bc.webp)
直接 fire 出去了,即先处理责任链后面的节点,若它们抛 BlockException,才处理。
![](https://filescdn.proginn.com/472840fedd113bea9ae739f2b74127d4/c48a7bc037cd4d011a218a7ba0cbdde5.webp)
StatisticSlot
![](https://filescdn.proginn.com/23ddeb2848575f368534d2f1141aada5/f6d4db006345ba41b4648d6bd53843bc.webp)
作用
![](https://filescdn.proginn.com/e8cad7fc5b45e2095f8841b939e32ba8/0a3bdd27e1e05204e3115847c168d9e6.webp)
数据统计。
原理
![](https://filescdn.proginn.com/e8cad7fc5b45e2095f8841b939e32ba8/0a3bdd27e1e05204e3115847c168d9e6.webp)
先 fire,等后面的节点处理完毕后,再进行统计数据。
为何这样设计?
因为后面节点是做控制,执行时可能正常通过,也可能抛 BlockException。
QPS 统计
使用滑动窗口线程并发的统计
使用 LongAdder
接下来几个 Slot 需要通过 dashboard 进行开启,因为需要配置规则。
也可以硬编码规则到代码中。但是要调整数值就比较麻烦,每次都要改代码。
往期推荐
![](https://filescdn.proginn.com/09bb937d306b4d87331fe3e436dddb1b/f1fce7aa50acffa4ec6bd6ca70973ca5.webp)
目前交流群已有 800+人,旨在促进技术交流,可关注公众号添加笔者微信邀请进群
喜欢文章,点个“在看、点赞、分享”素质三连支持一下~