前言
上篇文章中我们已经讲到了构造完处理链,然后会调用对应slot的entry方法,我们根据配置文件中Slot的具体顺序来逐一讲解Slot的具体实现。

一、NodeSelectorSlot
这个
slot主要负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级。
1.1 NodeSelectorSlot#entry

我们看到上面这个
entry方法中会给对应的context name生成一个defaultNode对象并挂载到Entrance Node中
我们看下下面的这个node对应图
Root是根节点,它对应的含义是应用级别
EntranceNode是一个线程节点,是属于context
而我们NodeSelectorSlot中维护的那个map,是对应相同资源不同context的DefaultNode。

1.2 NodeSelectorSlot#exit
这里啥也没做就是传递给下一个slot

二、ClusterBuilderSlot
2.1ClusterBuilderSlot#entry
- 这里首先会判断如果这个资源对应的
clusterNode不存在则会创建并放入缓存中,这里我们发现这个ClusterNode其实是和资源相关的,一个资源对应一个Cluster。- 把
ClusterNode设置到DefaultNode中,即不同的DefaultNode都关联了一个ClusterNode,这样我们就可以在不同的上下文中都拿到当前资源一个总的流量统计情况- 从
context中取出origin,这个origin就是上游,sentinel通过一些手段将上层服务资源传递到下层,这里如果originNode不存在也会进行创建

2.2ClusterBuilderSlot#entry
这里啥也没做就是传递给下一个slot

三、LogSlot
3.1LogSlot#entry
这里发现这个就是打印个日志,如果抛出熔断或限流异常就打印日志并原样抛出,如果抛出其他异常就打印日志并吞掉

3.2LogSlot#exit
抛出异常打印日志并吞掉

四、StatisticSlot
4.1 StatisticSlot#entry
- 先调用
fireEntry方法进入下面的slot进行流控和降级的判断- 如果通过限流和降级的判断,则对
node的请求通过数和并发线程数都进行累加操作- 如果限流和降级没有通过则会走到
catch中,如果是PriorityWaitException,这个处理逻辑里面只增加了并发线程数量,这个就是让他等待,但是还是会占用线程,如果是BlockException,这个是拒绝异常,限流跑出来的,这里会进行拒绝数量的统计。- 回调处理,调用
ProcessorSlotEntryCallback的对应方法
public void entry(Context context, ResourceWrapper resourceWrapper, DefaultNode node, int count,
boolean prioritized, Object... args) throws Throwable {
try {
// 先进入下面的slot进行流控/降级的判断
fireEntry(context, resourceWrapper, node, count, prioritized, args);
// Request passed, add thread count and pass count.
//能够走到这里,说明通过了流控/降级等处理,然后下面就进行一些统计信息的更新
//当前node的并发线程数+1
node.increaseThreadNum();
//通过请求数+n(一般这里就是1)
node.addPassRequest(count);
//如果有上游服务统计资源的话,则相应的增加上游服务的统计
if (context.getCurEntry().getOriginNode() != null) {
// Add count for origin node.
context.getCurEntry().getOriginNode().increaseThreadNum();
context.getCurEntry().getOriginNode().addPassRequest(count);
}
//如果这个资源类型是IN,增加整个集群node的统计信息
if (resourceWrapper.getEntryType() == EntryType.IN) {
// Add count for global inbound entry node for global statistics.
Constants.ENTRY_NODE.increaseThreadNum();
Constants.ENTRY_NODE.addPassRequest(count);
}
//如果这里注册了监听者的话,进行回调
for (ProcessorSlotEntryCallback<DefaultNode> handler : StatisticSlotCallbackRegistry.getEntryCallbacks()) {
handler.onPass(context, resourceWrapper, node, count, args);
}
} catch (PriorityWaitException ex) {
//线程数量
node.increaseThreadNum();
if (context.getCurEntry(

SentinelSlot机制详细解析,涵盖NodeSelectorSlot、ClusterBuilderSlot、LogSlot、StatisticSlot、AuthoritySlot、SystemSlot、FlowSlot和DegradeSlot的职责和实现,涉及资源路径收集、集群统计、日志记录、系统自适应限流、流量控制、权限校验和熔断策略等内容。
最低0.47元/天 解锁文章
214

被折叠的 条评论
为什么被折叠?



