自动采集资源网站源码分享(自动采集网站内容)

本篇文章给大家谈谈自动采集资源网站源码分享,以及自动采集网站内容对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。

本篇将重点关注Sentienl实时数据收集,即Sentienl具体是如何收集调用信息,以此来判断是否需要触发限流或熔断。

Sentienl实时数据收集的入口类为StatisticSlot。

我们先简单来看一下StatisticSlot该类的注释,来看一下该类的整体定位。

StatisticSlot,专用于实时统计的slot。在进入一个资源时,在执行Sentienl的处理链条中会进入到该slot中,需要完成如下计算任务:

集群维度计算资源的总统计信息,用于集群限流,后续文章将详细探讨。来自不同调用方/来源的群集节点的统计信息。特定调用上下文环境的统计信息。统计所有入口的统计信息。

接下来用源码分析的手段来详细分析StatisticSlot的实现原理。

1、源码分析StatisticSlot

1.1StatisticSlotentry详解

StatisticSlotentry

StatisticSlotentry

代码@1:首先调用fireEntry,先调用SentinelSlotChain中其他的处理器,执行完其他处理器的逻辑,例如FlowSlot、DegradeSlot,因为StatisticSlot的职责是收集统计信息。

代码@2:如果后续处理器成功执行,则将正在执行线程数统计指标加一,并将通过的请求数量指标增加对应的值。下文会对SentinelNode体系进行详细的介绍,在Sentinel中使用Node来表示调用链中的某一个节点,每个节点关联一个资源,资源的实时统计信息就存储在Node中,故该部分也是调用DefaultNode的相关方法来改变线程数等,将在下文会向详细介绍。

代码@3:如果上下文环境中保存了调用的源头(调用方)的节点信息不为空,则更新该节点的统计数据:线程数与通过数量。

代码@4:如果资源的进入类型为EntryType.IN,表示入站流量,更新入站全局统计数据(集群范围ClusterNode)。

代码@5:执行注册的进入Handler,可以通过StatisticSlotCallbackRegistry的addEntryCallback注册相关监听器。

代码@6:如果捕获到PriorityWaitException,则认为是等待过一定时间,但最终还是算通过,只需增加线程的个数,但无需增加节点通过的数量,具体原因我们在详细分析限流部分时会重点讨论,也会再次阐述PriorityWaitException的含义。

代码@7:如果捕获到BlockException,则主要增加阻塞的数量。

代码@8:如果是系统异常,则增加异常数量。

我想上面的代码应该不难理解,但涉及到统计指标数据的变化,都是调用DefaultNodenode相关的方法,从这里也可以看出,Node将是实时统计数据的直接持有者,那毋容置疑接下来将重点来学习Node,为了知识体系的完备性,我们先来看一下StatisticSlot的exit方法。

1.2StatisticSlotexit详解

StatisticSlot#exit

代码@1:成功执行,则重点关注响应时间,其实现亮点如下:

计算本次响应时间,将本次响应时间收集到Node中。将当前活跃线程数减一。

代码@2:执行退出时的callback。可以通过StatisticSlotCallbackRegistry的addExitCallback方法添加退出回调函数。

代码@3:传播exit事件。

接下来我们将重点介绍DefaultNode,即Sentinel的Node体系,持有资源的实时调用信息。

2、SentienlNode体系

2.1Node类体系图

我们先简单介绍一下上述核心类的作用与核心接口或核心属性的含义。

OccupySupport支持抢占未来的时间窗口,有点类似借用“未来”的令牌。其核心方法如下:1)longtryOccupyNext(longcurrentTime,intacquireCount,doublethreshold)尝试抢占未来的令牌,返回值为调用该方法的线程应该sleep的时间。1、longcurrentTime当前时间。2、intacquireCount本次需要申请的令牌个数。3、doublethreshold设置的阔值。2)longwaiting()获取当前已申请的未来的令牌的个数。3)voidaddWaitingRequest(longfutureTime,intacquireCount)申请未来时间窗口中的令牌。4)voidaddOccupiedPass(intacquireCount)增加申请未来令牌通过的个数。5)doubleoccupiedPassQps()当前抢占未来令牌的QPS。Node持有实时统计信息的节点。定义了收集统计信息与获取统计信息的接口,上面方法根据方法名称即可得知其含义,故这里就不一一罗列了。StatisticNode实现统计信息的默认实现类。DefaultNode用于在特定上下文环境中保存某一个资源的实时统计信息。ClusterNode实现基于集群限流模式的节点,将在集群限流模式部分详细介绍。EntranceNode用来表示调用链入口的节点信息。

本文将详细介绍DefaultNode与StatisticNode,重点阐述调用树与实时统计信息。DefaultNode是StatisticNode的子类,我们先从StatisticNode开始Node体系的探究。

3、StatisticNode详解

3.1核心类图

我们对其核心属性进行一一解读:

MetricrollingCounterInSecond=newArrayMetric(SampleCountProperty.SAMPLE_COUNT,IntervalProperty.INTERVAL)每秒的实时统计信息,使用ArrayMetric实现,即基于滑动窗口实现,正是上篇文章详细介绍的,默认1s采样2次。即一个统计周期中包含两个滑动窗口。MetricrollingCounterInMinute=newArrayMetric(60,60*1000,false)每分钟实时统计信息,同样使用ArrayMetric实现,即基于滑动窗口实现。每1分钟,抽样60次,即包含60个滑动窗口,每一个窗口的时间间隔为1s。LongAddercurThreadNum=newLongAdder()当前线程计数器。longlastFetchTime=-1上一次获取资源的有效统计数据的时间,即调用Node的metrics()方法的时间。

关于ArrayMetric滑动窗口设计与实现原理,请参考笔者的另一篇博文:源码分析Alibabasentinel滑动窗口实现原理(文末附原理图)

接下来我们挑选几个具有代表性的方法进行探究。

2.2addPassRequest

增加通过请求数量。即将实时调用信息向滑动窗口中进行统计。addPassRequest即报告成功的通过数量。就是分别调用秒级、分钟即对应的滑动窗口中添加数量,然后限流规则、熔断规则将基于滑动窗口中的值进行计算。

2.3totalRequest

获取当前时间戳的总请求数,获取分钟级时间窗口中的统计信息。

2.4successQps

成功TPS,用秒级统计滑动窗口中统计的个数除以窗口的间隔得出其tps,即抽样个数越大,其统计越精确。

温馨提示:上面的方法在学习了上文的滑动窗口设计原理后将显得非常简单,大家在学习的过程中,可以总结出一个规律,什么时候时候使用秒级滑动窗口,什么时候使用分钟级滑动窗口。

2.5metrics

由于Sentienl基于滑动窗口来实时收集统计信息,并存储在内存中,并随着时间的推移,旧的滑动窗口将失效,故需要提供一个方法,及时将所有的统计信息进行汇总输出,供监控客户端定时拉取,转储都其他客户端,例如数据库,方便监控数据的可视化,这也通常是中间件用于监控指标的监控与采集的通用设计方法。

代码@1:获取当前时间对应的滑动窗口的开始时间,可以对比上文计算滑动窗口的算法。

代码@2:获取一分钟内的所有滑动窗口中的统计数据,使用MetricNode表示。

代码@3:遍历所有节点,刷选出不是当前滑动窗口外的所有数据。这里的重点是方法:isNodeInTime。

这里只刷选出不是当前窗口的数据,即metrics方法返回的是“过去”的统计数据。

接下来我们再来看看DefaultNode相关的几个特性方法。

4、DefaultNode详解

4.1类图

DefaultNode是StatisticNode的子类,其额外增加的属性如下:

privateResourceWrapperid资源id,即DefaultNode才真正与资源挂钩,可以将DefaultNode看出是调用链中的一个节点,并且与资源关联。privatevolatileSet<Node>childList子节点结合。以此来维持其调用链。privateClusterNodeclusterNode集群节点,同样为StatisticNode的子类,表示与资源集群相关的环境。

接下来我们将来看一下DefaultNode的核心方法。

4.2increaseBlockQps

DefaultNode的此类方法,通常是先调用StatisticNode的方法,然后再调用clusterNode的相关方法,最终就是使用在对应的滑动窗口中增加或减少计量值。

其他方法也比较简单,就不再细看了,我们可以通过DefaultNode的printDefaultNode方法来打印该节点的调用链。

本文就介绍到这里了,本文详细介绍了Sentinel实时数据收集的统一入口StatisticSlot,并且介绍了SeninelNode体系,即调用链中的每一个节点,每一个节点对一个资源的实时统计信息。下一篇将开始重点限流是如何实现的,即FlowSlot的实现技巧。

源码分析Sentinel系列专栏连载中,已发表目录:

1、Sentinel限流与熔断初探(技巧篇)

2、滑动窗口实现原理(文末附原理图)

3、寻找一把Sentinel的钥匙

4、调用上下文环境实现原理(图文并茂)

关于自动采集资源网站源码分享,自动采集网站内容的介绍到此结束,希望对大家有所帮助。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平