区块链技术博客
www.b2bchain.cn

源码解读三:ProcessSlot具体实现求职学习资料

D0b2wT.gif

本文介绍了源码解读三:ProcessSlot具体实现求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

源码解读三:ProcessSlot具体实现

  • 源码解读三:ProcessSlot具体实现
    • 概述
    • 代码分析
      • NodeSelectorSlot
      • ClusterBuilderSlot
      • LogSlot
      • StatisticSlot
      • AuthoritySlot

概述

在前面的文章中我们知道,通过入口类 Sph 的 entry 方法,首先是获得(或创建)本次请求的 Context ,然后获取当前资源对应的 ProcessorSlotChain ,将 ResourceWrapper、Context、ProcessorSlotChain 一起构建出 CtEntry 代表着本次对某个资源的访问。随后将 CtEntry 通过 ProcessorSlotChain 的处理,就完成了一次资源访问的流控检查。Sentinel 在框架中内置了 8 个 ProcessorSlot 实现,本文就按照系统处理的顺序,来逐一说明每一个 ProcessorSlot 的作用。

代码分析

先回顾下总体类图

源码解读三:ProcessSlot具体实现

NodeSelectorSlot

该类上的 SpiOrder 注解的值为 -10000。这个类的作用是为 Context 设置当前的节点,也就是设置一个 DefaultNode 实例。

上文说过,DefaultNode 是存放不同 Context 下的不同资源的统计数据。考虑到同一个资源的 ProcessorSlotChain 是相同的,而 DefaultNode 需要针对不同的上下文名称做出区分。因此 NodeSelectorSlot 内部维护了一个 Map 类型对象map,存储上下文名称和 DefaultNode 的映射关系。

在 NodeSelectorSlot 中,如果当前的上下文名称还不存在 DefaultNode 的话,则会创建一个新的 DefaultNode 实例,并且放入到 Map 结构之中。与此同时,将该 DefaultNode 添加到 Context 中的路径中上一个节点的子节点列表中。上一个节点要么是代表资源的 DefaultNode ,要么是代表入口的 EntranceNode 。具体取决于当前的访问路径情况。

如果当前上下文名称已经有对应的 DefaultNode 存在,则直接取出这个 DefaultNode 实例,用于下面的设置。

在拥有了 DefaultNode 实例后,就将该实例设置给 Context 。这个设置的主要效果,是将 node 是设置给 Context 的curEntry属性指向的 CtEntry 的curNode属性。

在经过这个处理槽位后,Context 的当前 Entry 的当前 Node 就具备值了。后续的节点统计信息就有存放的地方了。

ClusterBuilderSlot

该类上的 SpiOrder 注解的值为 -9000 。

对于一个资源而言,其拥有全局唯一的 ProcessorSlotChain 和 ClusterNode 实例。ClusterBuilderSlot 的作用就是为 Context 的当前节点去创建或者获取 ClusterNode 实例。考虑到 ProcessorSlotChain 和 ClusterNode 都是相对资源全局唯一的,因此这个 ClusterNode 实例就存储在 ClusterBuilderSlot 的 clusterNode 属性。

ClusterBuilderSlot 的实现逻辑不复杂,首先是判断自身的 clusterNode 属性是否为空。在为空的情况下,首先新建一个 ClusterNode 实例,并且将这个实例放入 ClusterBuilderSlot#clusterNodeMap 这个 Map 类型的类属性。通过这个类属性,可以获取到全局所有的资源的聚集节点实例。

然后获取当前的 ClusterNode 实例,设置到当前节点(DefaultNode)的 clusterNode 属性。

此外,如果 Context 的 origin 属性有值的话,还需要为 Context 的当前 Entry 设置 originNode 属性。那么就需要通过 ClusterNode 的 getOrCreateOriginNode 方法获取一个 Node 对象来用于做来源节点。实际上就是从 ClusterNode 的 originCountMap 属性中来取得这个 Node 对象来当做来源节点。

在经过这个处理槽位后,Context 的当前 Entry 的当前 Node 的 clusterNode 和当前的 Entry 的来源节点就具备值了。资源的统计信息和来源统计信息就有存放的地方。

LogSlot

该类上的 SpiOrder 注解的值为 -8000 。

从处理槽位的名字可以明确看出,该槽位的作用就是用来日志输出。当发生阻断异常的时候,就会通过日志工具类来输出日志。这一块和主流程没有太大关系,默认实现是在抛出阻断异常的时候,在文件日志中进行内容输出。

StatisticSlot

该类上的 SpiOrder 注解的值为 -7000 。

该处理槽位的 Entry 方法是用于记录本次请求的统计信息。该槽位的实现内容首先是将 Entry 传递给后面的处理器,依据后面的处理流程是否抛出异常来记录不同的统计信息。

如果后续的处理流程顺利完成,没有任何异常,则

  • 当前节点的当前线程记录数加 1 。调用自身关联的聚集结点 ClusterNode ,当前线程记录数加 1 。
  • 当前节点的请求通过数增加入参 count 的值。调用自身关联的聚集结点 ClusterNode ,当前请求通过数加增加 count 的值 。
  • 如果当前 Entry 存在来源节点,获取来源节点,也增加上述两项内容的值。
  • 如果当前资源的访问方向是入站方向,获取全局统一的 Constants#ENTRY_NODE 属性指向的 ClusterNode ,也增加上述两项内容的值。
  • 触发注册在系统中的 ProcessorSlotEntryCallback 回调函数。不过默认情况下,并没有实际的回调内容产生。

如果后续的处理流程抛出了 PriorityWaitException 异常,则处理方式和上述相同,但是只增加线程数而不增加请求通过数。

如果后续的处理流程抛出了阻断异常,则

  • 为当前 Entry 设置阻断异常实例。
  • 当前节点增加阻断计数,增加计数值为 count 。
  • 如果当前 Entry 存在来源节点,获取来源节点,增加阻断计数。
  • 如果当前资源的访问方向是入站方向,获取全局统一的 Constants#ENTRY_NODE 属性指向的 ClusterNode 增加阻断计数。
  • 触发注册在系统中的 ProcessorSlotEntryCallback 回调函数。不过默认情况下,并没有实际的回调内容产生。
  • 将异常抛出。

如果后续的处理流程抛出了其他异常,则

  • 为当前 Entry 设置异常实例。
  • 将异常抛出。

当资源访问完毕,调用 Entry.exit 方法的时候,也会触发到这个槽位的 exit 方法。其实现内容如下:

  • 如果当前 Entry 没有设置阻断异常,则获取当前时间戳,并且计算该请求的响应时间。为当前节点,来源节点,全局入站流量节点分别增加响应时间和成功通过计数。
  • 触发退出回调。

AuthoritySlot

源码解读三:ProcessSlot具体实现

  • 源码解读三:ProcessSlot具体实现
    • 概述
    • 代码分析
      • NodeSelectorSlot
      • ClusterBuilderSlot
      • LogSlot
      • StatisticSlot
      • AuthoritySlot

概述

在前面的文章中我们知道,通过入口类 Sph 的 entry 方法,首先是获得(或创建)本次请求的 Context ,然后获取当前资源对应的 ProcessorSlotChain ,将 ResourceWrapper、Context、ProcessorSlotChain 一起构建出 CtEntry 代表着本次对某个资源的访问。随后将 CtEntry 通过 ProcessorSlotChain 的处理,就完成了一次资源访问的流控检查。Sentinel 在框架中内置了 8 个 ProcessorSlot 实现,本文就按照系统处理的顺序,来逐一说明每一个 ProcessorSlot 的作用。

代码分析

先回顾下总体类图

源码解读三:ProcessSlot具体实现

NodeSelectorSlot

该类上的 SpiOrder 注解的值为 -10000。这个类的作用是为 Context 设置当前的节点,也就是设置一个 DefaultNode 实例。

上文说过,DefaultNode 是存放不同 Context 下的不同资源的统计数据。考虑到同一个资源的 ProcessorSlotChain 是相同的,而 DefaultNode 需要针对不同的上下文名称做出区分。因此 NodeSelectorSlot 内部维护了一个 Map 类型对象map,存储上下文名称和 DefaultNode 的映射关系。

在 NodeSelectorSlot 中,如果当前的上下文名称还不存在 DefaultNode 的话,则会创建一个新的 DefaultNode 实例,并且放入到 Map 结构之中。与此同时,将该 DefaultNode 添加到 Context 中的路径中上一个节点的子节点列表中。上一个节点要么是代表资源的 DefaultNode ,要么是代表入口的 EntranceNode 。具体取决于当前的访问路径情况。

如果当前上下文名称已经有对应的 DefaultNode 存在,则直接取出这个 DefaultNode 实例,用于下面的设置。

在拥有了 DefaultNode 实例后,就将该实例设置给 Context 。这个设置的主要效果,是将 node 是设置给 Context 的curEntry属性指向的 CtEntry 的curNode属性。

在经过这个处理槽位后,Context 的当前 Entry 的当前 Node 就具备值了。后续的节点统计信息就有存放的地方了。

ClusterBuilderSlot

该类上的 SpiOrder 注解的值为 -9000 。

对于一个资源而言,其拥有全局唯一的 ProcessorSlotChain 和 ClusterNode 实例。ClusterBuilderSlot 的作用就是为 Context 的当前节点去创建或者获取 ClusterNode 实例。考虑到 ProcessorSlotChain 和 ClusterNode 都是相对资源全局唯一的,因此这个 ClusterNode 实例就存储在 ClusterBuilderSlot 的 clusterNode 属性。

ClusterBuilderSlot 的实现逻辑不复杂,首先是判断自身的 clusterNode 属性是否为空。在为空的情况下,首先新建一个 ClusterNode 实例,并且将这个实例放入 ClusterBuilderSlot#clusterNodeMap 这个 Map 类型的类属性。通过这个类属性,可以获取到全局所有的资源的聚集节点实例。

然后获取当前的 ClusterNode 实例,设置到当前节点(DefaultNode)的 clusterNode 属性。

此外,如果 Context 的 origin 属性有值的话,还需要为 Context 的当前 Entry 设置 originNode 属性。那么就需要通过 ClusterNode 的 getOrCreateOriginNode 方法获取一个 Node 对象来用于做来源节点。实际上就是从 ClusterNode 的 originCountMap 属性中来取得这个 Node 对象来当做来源节点。

在经过这个处理槽位后,Context 的当前 Entry 的当前 Node 的 clusterNode 和当前的 Entry 的来源节点就具备值了。资源的统计信息和来源统计信息就有存放的地方。

LogSlot

该类上的 SpiOrder 注解的值为 -8000 。

从处理槽位的名字可以明确看出,该槽位的作用就是用来日志输出。当发生阻断异常的时候,就会通过日志工具类来输出日志。这一块和主流程没有太大关系,默认实现是在抛出阻断异常的时候,在文件日志中进行内容输出。

StatisticSlot

该类上的 SpiOrder 注解的值为 -7000 。

该处理槽位的 Entry 方法是用于记录本次请求的统计信息。该槽位的实现内容首先是将 Entry 传递给后面的处理器,依据后面的处理流程是否抛出异常来记录不同的统计信息。

如果后续的处理流程顺利完成,没有任何异常,则

  • 当前节点的当前线程记录数加 1 。调用自身关联的聚集结点 ClusterNode ,当前线程记录数加 1 。
  • 当前节点的请求通过数增加入参 count 的值。调用自身关联的聚集结点 ClusterNode ,当前请求通过数加增加 count 的值 。
  • 如果当前 Entry 存在来源节点,获取来源节点,也增加上述两项内容的值。
  • 如果当前资源的访问方向是入站方向,获取全局统一的 Constants#ENTRY_NODE 属性指向的 ClusterNode ,也增加上述两项内容的值。
  • 触发注册在系统中的 ProcessorSlotEntryCallback 回调函数。不过默认情况下,并没有实际的回调内容产生。

如果后续的处理流程抛出了 PriorityWaitException 异常,则处理方式和上述相同,但是只增加线程数而不增加请求通过数。

如果后续的处理流程抛出了阻断异常,则

  • 为当前 Entry 设置阻断异常实例。
  • 当前节点增加阻断计数,增加计数值为 count 。
  • 如果当前 Entry 存在来源节点,获取来源节点,增加阻断计数。
  • 如果当前资源的访问方向是入站方向,获取全局统一的 Constants#ENTRY_NODE 属性指向的 ClusterNode 增加阻断计数。
  • 触发注册在系统中的 ProcessorSlotEntryCallback 回调函数。不过默认情况下,并没有实际的回调内容产生。
  • 将异常抛出。

如果后续的处理流程抛出了其他异常,则

  • 为当前 Entry 设置异常实例。
  • 将异常抛出。

当资源访问完毕,调用 Entry.exit 方法的时候,也会触发到这个槽位的 exit 方法。其实现内容如下:

  • 如果当前 Entry 没有设置阻断异常,则获取当前时间戳,并且计算该请求的响应时间。为当前节点,来源节点,全局入站流量节点分别增加响应时间和成功通过计数。
  • 触发退出回调。

AuthoritySlot

源码解读三:ProcessSlot具体实现

  • 源码解读三:ProcessSlot具体实现
    • 概述
    • 代码分析
      • NodeSelectorSlot
      • ClusterBuilderSlot
      • LogSlot
      • StatisticSlot
      • AuthoritySlot

概述

在前面的文章中我们知道,通过入口类 Sph 的 entry 方法,首先是获得(或创建)本次请求的 Context ,然后获取当前资源对应的 ProcessorSlotChain ,将 ResourceWrapper、Context、ProcessorSlotChain 一起构建出 CtEntry 代表着本次对某个资源的访问。随后将 CtEntry 通过 ProcessorSlotChain 的处理,就完成了一次资源访问的流控检查。Sentinel 在框架中内置了 8 个 ProcessorSlot 实现,本文就按照系统处理的顺序,来逐一说明每一个 ProcessorSlot 的作用。

代码分析

先回顾下总体类图

源码解读三:ProcessSlot具体实现

NodeSelectorSlot

该类上的 SpiOrder 注解的值为 -10000。这个类的作用是为 Context 设置当前的节点,也就是设置一个 DefaultNode 实例。

上文说过,DefaultNode 是存放不同 Context 下的不同资源的统计数据。考虑到同一个资源的 ProcessorSlotChain 是相同的,而 DefaultNode 需要针对不同的上下文名称做出区分。因此 NodeSelectorSlot 内部维护了一个 Map 类型对象map,存储上下文名称和 DefaultNode 的映射关系。

在 NodeSelectorSlot 中,如果当前的上下文名称还不存在 DefaultNode 的话,则会创建一个新的 DefaultNode 实例,并且放入到 Map 结构之中。与此同时,将该 DefaultNode 添加到 Context 中的路径中上一个节点的子节点列表中。上一个节点要么是代表资源的 DefaultNode ,要么是代表入口的 EntranceNode 。具体取决于当前的访问路径情况。

如果当前上下文名称已经有对应的 DefaultNode 存在,则直接取出这个 DefaultNode 实例,用于下面的设置。

在拥有了 DefaultNode 实例后,就将该实例设置给 Context 。这个设置的主要效果,是将 node 是设置给 Context 的curEntry属性指向的 CtEntry 的curNode属性。

在经过这个处理槽位后,Context 的当前 Entry 的当前 Node 就具备值了。后续的节点统计信息就有存放的地方了。

ClusterBuilderSlot

该类上的 SpiOrder 注解的值为 -9000 。

对于一个资源而言,其拥有全局唯一的 ProcessorSlotChain 和 ClusterNode 实例。ClusterBuilderSlot 的作用就是为 Context 的当前节点去创建或者获取 ClusterNode 实例。考虑到 ProcessorSlotChain 和 ClusterNode 都是相对资源全局唯一的,因此这个 ClusterNode 实例就存储在 ClusterBuilderSlot 的 clusterNode 属性。

ClusterBuilderSlot 的实现逻辑不复杂,首先是判断自身的 clusterNode 属性是否为空。在为空的情况下,首先新建一个 ClusterNode 实例,并且将这个实例放入 ClusterBuilderSlot#clusterNodeMap 这个 Map 类型的类属性。通过这个类属性,可以获取到全局所有的资源的聚集节点实例。

然后获取当前的 ClusterNode 实例,设置到当前节点(DefaultNode)的 clusterNode 属性。

此外,如果 Context 的 origin 属性有值的话,还需要为 Context 的当前 Entry 设置 originNode 属性。那么就需要通过 ClusterNode 的 getOrCreateOriginNode 方法获取一个 Node 对象来用于做来源节点。实际上就是从 ClusterNode 的 originCountMap 属性中来取得这个 Node 对象来当做来源节点。

在经过这个处理槽位后,Context 的当前 Entry 的当前 Node 的 clusterNode 和当前的 Entry 的来源节点就具备值了。资源的统计信息和来源统计信息就有存放的地方。

LogSlot

该类上的 SpiOrder 注解的值为 -8000 。

从处理槽位的名字可以明确看出,该槽位的作用就是用来日志输出。当发生阻断异常的时候,就会通过日志工具类来输出日志。这一块和主流程没有太大关系,默认实现是在抛出阻断异常的时候,在文件日志中进行内容输出。

StatisticSlot

该类上的 SpiOrder 注解的值为 -7000 。

该处理槽位的 Entry 方法是用于记录本次请求的统计信息。该槽位的实现内容首先是将 Entry 传递给后面的处理器,依据后面的处理流程是否抛出异常来记录不同的统计信息。

如果后续的处理流程顺利完成,没有任何异常,则

  • 当前节点的当前线程记录数加 1 。调用自身关联的聚集结点 ClusterNode ,当前线程记录数加 1 。
  • 当前节点的请求通过数增加入参 count 的值。调用自身关联的聚集结点 ClusterNode ,当前请求通过数加增加 count 的值 。
  • 如果当前 Entry 存在来源节点,获取来源节点,也增加上述两项内容的值。
  • 如果当前资源的访问方向是入站方向,获取全局统一的 Constants#ENTRY_NODE 属性指向的 ClusterNode ,也增加上述两项内容的值。
  • 触发注册在系统中的 ProcessorSlotEntryCallback 回调函数。不过默认情况下,并没有实际的回调内容产生。

如果后续的处理流程抛出了 PriorityWaitException 异常,则处理方式和上述相同,但是只增加线程数而不增加请求通过数。

如果后续的处理流程抛出了阻断异常,则

  • 为当前 Entry 设置阻断异常实例。
  • 当前节点增加阻断计数,增加计数值为 count 。
  • 如果当前 Entry 存在来源节点,获取来源节点,增加阻断计数。
  • 如果当前资源的访问方向是入站方向,获取全局统一的 Constants#ENTRY_NODE 属性指向的 ClusterNode 增加阻断计数。
  • 触发注册在系统中的 ProcessorSlotEntryCallback 回调函数。不过默认情况下,并没有实际的回调内容产生。
  • 将异常抛出。

如果后续的处理流程抛出了其他异常,则

  • 为当前 Entry 设置异常实例。
  • 将异常抛出。

当资源访问完毕,调用 Entry.exit 方法的时候,也会触发到这个槽位的 exit 方法。其实现内容如下:

  • 如果当前 Entry 没有设置阻断异常,则获取当前时间戳,并且计算该请求的响应时间。为当前节点,来源节点,全局入站流量节点分别增加响应时间和成功通过计数。
  • 触发退出回调。

AuthoritySlot

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » 源码解读三:ProcessSlot具体实现求职学习资料
分享到: 更多 (0)
D0b2wT.gif

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们