外贸网站交易平台建筑网上接活平台

张小明 2026/1/11 1:22:28
外贸网站交易平台,建筑网上接活平台,网页设计考试,上海高端网站建设公限流是保障服务高可用的方式之一#xff0c;尤其是在微服务架构中#xff0c;对接口或资源进行限流可以有效地保障服务的可用性和稳定性。之前的项目中使用的限流措施主要是Guava的RateLimiter。RateLimiter是基于令牌桶流控算法#xff0c;使用非常简单#xff0c;但是功能…限流是保障服务高可用的方式之一尤其是在微服务架构中对接口或资源进行限流可以有效地保障服务的可用性和稳定性。之前的项目中使用的限流措施主要是Guava的RateLimiter。RateLimiter是基于令牌桶流控算法使用非常简单但是功能相对比较少。而现在我们有了一种新的选择阿里提供的Sentinel。Sentinel 是阿里巴巴提供的一种限流、熔断中间件与RateLimiter相比Sentinel提供了丰富的限流、熔断功能。它支持控制台配置限流、熔断规则支持集群限流并可以将相应服务调用情况可视化。目前已经有很多项目接入了Sentinel而本文主要是对Sentinel的限流功能做一次详细的分析至于Sentinel的其他能力则不作深究。一总体流程从设计模式上来看典型的的责任链模式。外部请求进来后要经过责任链上各个节点的处理而Sentinel的限流、熔断就是通过责任链上的这些节点实现的。从限流算法来看Sentinel使用滑动窗口算法来进行限流。要想深入了解原理还是得从源码上入手下面直接进入Sentinel的源码阅读。二源码解读1总体流程读源码先得找到源码入口。我们经常使用 SentinelResource来标记一个方法可以将这个被 SentinelResource标记的方法看成是一个Sentinel资源。因此我们以 SentinelResource为入口找到其切面看看切面拦截后所做的工作就可以明确Sentinel的工作原理了。直接看注解SentinelResource的切面代码SentinelResourceAspect。可以清晰的看到Sentinel的行为方式。进入SentinelResource切面后会执行SphU.entry方法在这个方法中会对被拦截方法做限流和熔断的逻辑处理。如果触发熔断和限流会抛出BlockException我们可以指定blockHandler方法来处理BlockException。而对于业务上的异常我们也可以配置fallback方法来处理被拦截方法调用产生的异常。所以Sentinel熔断限流的处理主要是在SphU.entry方法中其主要处理逻辑见下图源码。可见在SphU.entry方法中Sentinel实现限流、熔断等功能的流程可以总结如下获取Sentinel上下文Context获取资源对应的责任链生成资源调用凭证Entry执行责任链中各个节点。接下来围绕这几个方面对Sentinel的服务机制做一个系统的阐述。2获取Sentinel上下文ContextContext顾名思义就是Sentinel熔断限流执行的上下文包含资源调用的节点和Entry信息。来看看Context的特征Context是线程持有的利用ThreadLocal与当前线程绑定Context包含的内容这里就引出了Sentinel的三个比较重要的概念ConetxtNodeEntry。这三个类是Sentinel的核心类提供了资源调用路径、资源调用统计等信息。ContextContext是当前线程所持有的Sentinel上下文。进入Sentinel的逻辑时会首先获取当前线程的Context如果没有则新建。当任务执行完毕后会清除当前线程的context。Context 代表调用链路上下文贯穿一次调用链路中的所有 Entry。Context 维持着入口节点entranceNode、本次调用链路的 当前节点curNode、调用来源origin等信息。Context 名称即为调用链路入口名称。NodeNode是对一个SentinelResource标记的资源的统计包装。Context中记录本当前线程资源调用的入口节点。我们可以通过入口节点的childList可以追溯资源的调用情况。而每个节点都对应一个SentinelResource标记的资源及其统计数据例如passQpsblockQpsrt等数据。EntryEntry是Sentinel中用来表示是否通过限流的一个凭证如果能正常返回则说明你可以访问被Sentinel保护的后方服务否则Sentinel会抛出一个BlockException。另外它保存了本次执行entry()方法的一些基本信息包括资源的Context、Node、对应的责任链等信息后续完成资源调用后还需要更具获得的这个Entry去执行一些善后操作包括退出Entry对应的责任链完成节点的一些统计信息更新清除当前线程的Context信息等。3. 获取SentinelResource标记资源对应的责任链资源对应的责任链是限流逻辑具体执行的地方采用的是典型的责任链模式。默认的责任链中的处理节点包括NodeSelectorSlot、ClusterBuilderSlot、StatisticSlot、FlowSlot、DegradeSlot等。调用链ProcessorSlotChain和其中包含的所有Slot都实现了ProcessorSlot接口采用责任链的模式执行各个节点的处理逻辑并调用下一个节点。此外相同资源SentinelResource标记的方法对应的责任链是一致的。也就是说每个资源对应一条单独的责任链可以看下源码中资源责任链的获取逻辑先从缓存获取没有则新建。4. 生成调用凭证Entry生成的Entry是CtEntry。其构造参数包括资源包装ResourceWrapper、资源对应的责任链以及当前线程的Context。可以看到新建CtEntry记录了当前资源的责任链和Context同时更新Context将Context的当前Entry设置为自己。可以看到CtEntry是一个双向链表构建了Sentinel资源的调用链路。5责任链的执行接下来就进入了责任链的执行。责任链和其中的Slot都实现了ProcessorSlot责任链的entry方法会依次执行责任链各个slot所以下面就进入了责任链中的各个Slot。为了突出重点这次本文只研究与限流功能有关的Slot。5.1NodeSelectorSlot -- 获取当前资源对应Node构建节点调用树此节点负责获取或者构建当前资源对应的Node这个Node被用于后续资源调用的统计及限流和熔断条件的判断。同时NodeSelectorSlot还会完成调用链路构建。来看源码熟悉的代码风格。我们知道一个资源对应一个责任链。每个调用链中都有NodeSelectorSlot。NodeSelectSlot中的node缓存map是非静态变量所以map只对当前这个资源共用不同的资源对应的NodeSelectSlot及Node的缓存都是不一样的资源和Node缓存map的关系可见下图。所以NodeSelectorSlot的的作用是在资源对应的调用链执行时获取当前context对应的Node这个Node代表着这个资源的调用情况。将获取到的node设为当前node添加到之前的node后面形成树状的调用路径。通过Context中的当前Entry进行触发下一个Slot的执行。这里有个很有趣的问题就是我们在责任链的NodeSelectorSlot中获取资源对应的Node时为什么用的是Context的name而不是SentinelResource的name呢首先我们知道一个资源对应一条责任链。但是进入一个资源调用的Context却可能是不同的。如果使用资源名来作为key获取对应的Node那么通过不同context进来的调用方法获取到的Node就都是同一个了。所以通过这种方式可以将相同resource对应的node按Context区分开。举个例子Sentinel功能的实现不仅仅可以通过SentinelResource注解方法来实现也可以通过引入相关依赖sentinel-dubbo-adapter利用Dubbo的Filter机制直接对DUBBO接口进行保护。我们来比较SentinelResource和Dubbo方式生成Context的区别Dubbo Filter方式生成的context的name是Dubbo的接口限定名或者方法限定名。如果出现嵌套在Dubbo Filter方式下面的其他SentinelResource的资源调用那么这些资源调用的就会就会出现不同的Context。所以有这样一种情况不同的dubbo接口进来这些dubbo接口都调用了同一个SentinelResource标记的方法那么这个方法对应的SentinelReource的在执行时对应的Context就是不同的。另一个问题是既然资源按Context分出了不同的node那我们想看资源总数统计是怎么办呢这就涉及到ClusterNode了。详细可见ClusterBuilderSlot。5.2ClusterBuilderSlot -- 聚合相同资源不同Context的Node此节点负责聚合相同资源不同Context对应的Node以供后续限流判断使用。可以看到ClusterNode的获取是以资源名为key。ClusterNode将会成为当前node的一个属性主要目的是为了聚合同一个资源不同Context情况下的多个node。默认的限流条件判断就是依据ClusterNode中的统计信息来进行的5.3 StatisticSlot -- 资源调用统计此节点主要负责资源调用的统计信息的计算和更新。与前面以及后面的slot不同StatisticSlot的执行时先触发下一个slot的执行等下面的slot执行完才会执行自己的逻辑。这也很好理解作为统计组件总要等熔断或者限流处理完之后才能做统计吧。下面看一下具体的统计过程。上面这张图已经很清晰的描述了StatisticSlot的数据统计的过程。可以注意一下无异常和阻塞异常的情况主要是更新线程数、通过请求数量和阻塞请求数量。不管是DefaultNode还是ClusterNode都继承自StatisticNode。所以Node的数据更新要来到StatisticNode。参考Sentinel数据统计框图描述了Node统计数据更新的大体流程如下我们从StatisticNode.addPassRequest()方法入手以passQps为例探究StatisticNode是如何更新通过请求的QPS计数的。从源码可见计数变量rollingCounterInSecond和rollingCounterInMinute都是Metric两个变量的时间维度分别是秒和分钟。rollingCounterInSecond和rollingCounterInMinute用的是Metric的实现类ArrayMetric。从ArrayMetric追溯下去统计信息都是保存到ArrayMetric的data也就是LeapArrayMertricBucket中的。LeapArray是时间窗口数组。基本信息包括时间窗口长度mswindowLengthInMs取样数也就是时间窗口的数量sampleCount时间间隔msintervalInMs以及时间窗口数组array。时间窗口长度、取样数及时间间隔有下面的关系windowLengthInMs intervalInMs / sampleCount代码中rollingCounterInSecond使用的intervalInMs 是1000ms也就是1ssampleCount2。所以窗口时长就是windowLengthInMs 500ms。rollingCounterInMinute使用的intervalInMs 是60 * 1000ms也就是60s。sampleCount60所以windowLengthInMs 1000ms也就是1s。时间窗口数组array是类型是AtomicReferenceArray可见这是一个原子操作的的数组引用。数组元素类型是WindowWrapMetricBucket。windowWrap是对时间窗口的一个包装包括窗口的开始时间windowStart及窗口的长度windowLengthInMs以及本窗口的计数器value类型为MetricBucket。窗口实际的计数是由MetricBucket进行的计数信息是保存在MetricBucket里计数器counters类型为LongAdder。可以看一下下图计数组件的组成框图回到StatisticNode.addPassRequest方法以rollingCounterInSecond.addPass(count)为例探究Sentinel如何进行滑动窗口计数的。5.3.1 获取当前时间窗口1取当前时间戳对应的数组下标long timeId time / windowLengthint idx (int)(timeId % array.length());time为当前时间windowLength为时间窗口长度rollingCounterInSecond的时间窗口长度是500ms。array 是单位时间内时间窗口的数量rollingCounterInSecond的单位时间1s时间窗口数是2。timeId是当前时间对时间窗口的整除。time每增加一个windowLength的长度timeId就会增加1时间窗口就会往前滑动一个。2计算窗口开始时间窗口开始时间 当前时间ms-当前时间ms%时间窗口长度ms获取的窗口开始时间均为时间窗口的整数倍。3获取时间窗口首先根据数组下标从LeapArray的数组中获取时间窗口。如果获取到的时间窗口自为空则新建时间窗口CAS。如果获取到的时间窗口非空且时间窗口的开始时间等于我们计算的开始时间说明当前时间正好在这个时间窗口里直接返回该时间窗口。如果获取到的时间窗口非空且时间窗口的开始时间小于我们计算的开始时间说明时间窗口已经过期距离上次获取时间窗口已经过去比较久的场景需要更新时间窗口加锁操作将时间窗口的开始时间设为计算出来的开始时间将时间窗口里的计数器重置为0。如果获取到的时间窗口非空且时间窗口的开始时间大于我们计算的开始时间创建新的时间窗口。这个一般不会走进这个分支因为说明当前时间已经落后于时间窗口了获取到的时间窗口是将来的时间那就没有意义了。5.3.2 对时间窗口的计数器进行累加时间窗口计数器是一个LongAdder数组这个数组用于存放通过请求数、异常请求数、阻塞请求数等数据。如下图其中通过计数、阻塞计数、异常计数为执行StatisticSlot的entry方法时更新。成功计数及响应时间是执行StatisticSlot的exit方法时更新。其实就是分别在被拦截方法执行前和执行后进行相应计数的更新。当然addPass就是在计数数组的第一个元素上进行累加。计数数组元素类型是LongAdder。LongAdder是JDK8添加到JUC中的。它是一个线程安全的、比Atomic*系工具性能更好的计数器。5.4 FlowSlot -- 限流判断FlowSlot是进行限流条件判断的节点。之前在StatisticSlot对相关资源调用做的统计在FlowSlot限流判断时将会得到使用。直接来到限流操作的核心逻辑–限流规则检查器FlowRuleChecker主要的流程包括获取资源对应的限流规则根据限流规则检查是否被限流如果被限流则抛出限流异常FlowException。FlowException继承自BlockException。那么FlowSlot检查是否限流的过程是怎么样的默认情况下限流使用的节点是当前节点的cluster node。主要分析的限流方式是QPS限流。来看一下限流的关键代码DefaultController获取节点的当前qps计数判断获取新的计数后是否超过阈值超过阈值单返回false表示被限流后面会抛出FlowException。否则返回true不被限流。可以看到限流判断非常简单只需要对qps计数进行检查就可以了。这归功于StatisticSlot做的数据统计。NodeSelectorSlot用于获取资源对应的Node并构建Node调用树将SentinelSource的调用链路以Node Tree的形式组起来。ClusterBuilderSlot为当前Node创建对应的ClusterNode聚合相同资源对应的不同Context的Node后续的限流依据就是这个ClusterNode。ClusterNode继承自StatisticNode记录着相应资源处理的一些统计数据。StatisticSlot用于更新资源调用的相关计数用于后续的限流判断使用。FlowSlot根据资源对应Node的调用计数判断是否进行限流。至此Sentinel的责任链执行逻辑就完整了。6,Sentienl 的收尾工作无论执行成功还是失败或者是阻塞都会执行Entry.exit()方法来看一下这个方法。判断要退出的entry是否是当前context的当前entry如果要退出的entry不是当前context的当前entry则不退出此entry而是退出context的的当前entry及其所有父entry并抛出异常如果要退出的entry是当前context的当前entry这种是正常情况先退出当前entry对应的责任链的所有slot。在这一步StatisticSlot会更新node的success计数和RT计数将context的当前entry置为被退出的entry的父entry如果被退出entry的父entry为空且context为默认context自动退出默认context清除ThreadLocal。清除被退出entry的context引用AI大模型学习福利作为一名热心肠的互联网老兵我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。一、全套AGI大模型学习路线AI大模型时代的学习之旅从基础到前沿掌握人工智能的核心技能因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获取二、640套AI大模型报告合集这套包含640份报告的合集涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师还是对AI大模型感兴趣的爱好者这套报告合集都将为您提供宝贵的信息和启示。因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获三、AI大模型经典PDF籍随着人工智能技术的飞速发展AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型如GPT-3、BERT、XLNet等以其强大的语言理解和生成能力正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获四、AI大模型商业化落地方案因篇幅有限仅展示部分资料需要点击文章最下方名片即可前往获作为普通人入局大模型时代需要持续学习和实践不断提高自己的技能和认知水平同时也需要有责任感和伦理意识为人工智能的健康发展贡献力量
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

好的装修网站视频网站开发与制作

AutoCAD字体管理革命:FontCenter如何让字体问题成为历史? 【免费下载链接】FontCenter AutoCAD自动管理字体插件 项目地址: https://gitcode.com/gh_mirrors/fo/FontCenter 还在为CAD图纸打开时出现的"字体缺失"提示而烦恼吗&#xff1…

张小明 2026/1/5 6:14:10 网站建设

网站建设需要哪些内容优设网网址

摘要:​ 在长沙想成为网络安全工程师?你会发现市场看似选择众多,但懂行的人只会告诉你一个真相:要么选湖南网安基地,要么就是在“试错”。这篇文章为你深度剖析长沙网安培训的行业现状,告诉你为什么湖南网安…

张小明 2025/12/30 12:18:07 网站建设

番禺做网站设计专业网站制作网络公司

Bypass Paywalls Clean终极指南:突破付费墙限制的完整解决方案 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在信息爆炸的时代,知识获取却面临前所未有的挑战…

张小明 2025/12/30 17:10:06 网站建设

企业购物网站开发重庆百度提升优化

在即时通讯库yowsup的开发过程中,代码质量直接影响着项目的稳定性和可维护性。许多开发团队在协作时经常遇到代码风格不统一、格式混乱、低级错误频发等问题,这不仅增加了代码审查的负担,也降低了开发效率。本文将为您提供一套完整的pre-comm…

张小明 2026/1/10 6:16:37 网站建设

打不开住房和城乡建设部网站做网站如何写代码

LangFlow在企业级AI中的应用前景分析 在当前企业加速拥抱人工智能的浪潮中,一个现实问题日益凸显:如何让非技术背景的业务人员也能参与到AI系统的构建中?传统的LangChain开发依赖于熟练的Python工程师编写大量胶水代码,从提示词模…

张小明 2025/12/30 11:44:32 网站建设

做网站如何来钱网站建设外包

你是否曾经遇到过这样的场景:精心收藏的B站视频突然下架,那些存储在手机里的m4s缓存文件变成了无法播放的数字废品?别担心,今天我要分享的这款神器,将彻底改变你的视频收藏体验! 【免费下载链接】m4s-conve…

张小明 2026/1/8 22:02:01 网站建设