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 进行开启,因为需要配置规则。
也可以硬编码规则到代码中。但是要调整数值就比较麻烦,每次都要改代码。