Sentinel源码解析-ProcessorSlot具体

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

前言

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


一、NodeSelectorSlot

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

1.1 NodeSelectorSlot#entry

在这里插入图片描述

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

在这里插入图片描述

1.2 NodeSelectorSlot#exit

这里啥也没做就是传递给下一个slot

在这里插入图片描述

二、ClusterBuilderSlot

2.1ClusterBuilderSlot#entry

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

在这里插入图片描述

2.2ClusterBuilderSlot#entry

这里啥也没做就是传递给下一个slot

在这里插入图片描述

三、LogSlot

3.1LogSlot#entry

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

在这里插入图片描述

3.2LogSlot#exit

抛出异常打印日志并吞掉

在这里插入图片描述

四、StatisticSlot

4.1 StatisticSlot#entry

  1. 先调用fireEntry方法进入下面的slot进行流控和降级的判断
  2. 如果通过限流和降级的判断,则对node的请求通过数和并发线程数都进行累加操作
  3. 如果限流和降级没有通过则会走到catch中,如果是PriorityWaitException,这个处理逻辑里面只增加了并发线程数量,这个就是让他等待,但是还是会占用线程,如果是BlockException,这个是拒绝异常,限流跑出来的,这里会进行拒绝数量的统计。
  4. 回调处理,调用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(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值