Alibaba中Sentinel骨架的示例分析


这篇文章主要介绍Alibaba中Sentinel骨架的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Sentinel 的核心骨架,将不同的 Slot 按照顺序串在一起(责任链模式),从而将不同的功能(限流、降级、系统保护)组合在一起。slot chain 其实可以分为两部分:统计数据构建部分(statistic)和判断部分(rule checking)。核心结构:这段代码是Sentinel业务埋点示例,通过示例我们可以看出Sentinel对资源的控制入口是SphU.entry(resourceName, EntryType.IN);,源码如下:这里第一个参数是受保护资源的唯一名称;第二个参数表示流量类型:EntryType.IN:是指进入我们系统的入口流量,比如 http 请求或者是其他的 rpc 之类的请求,设置为IN主要是为了保护自己系统。EntryType.OUT:是指我们系统调用其他第三方服务的出口流量,设置为OUT是为了保护第三方系统。这段代码没什么逻辑,只是转发了下,跟进源码可以发现最终逻辑实在CtSph#entryWithPriority(ResourceWrapper, int, boolean, Object...)方法中。Sentinel的核心是资源,这里的资源可以是任何东西,服务,服务里的方法,甚至是一段代码。而SphU.entry(resourceName);这段代码的主要作用是 :定义一个Sentinel资源检验资源所对应的规则是否生效核心代码如下:核心逻辑如下:通过当前线程的上下文,获取到当前线程的【簇点链路】入口。判断全局开关是否关闭。通过唯一的资源标识获取到对应的功能插槽链(ProcessorSlot)的第一个插槽。构建Sentinel调用链入口,并执行调用链如果抛出BlockException表示触发了资源限制规则,需要进行熔断降级。这里有两个需要注意的地方:【簇点链路】入口Context的数量是有限制的,最大2000个,通常情况下,我们都不需要显示设置 context,使用默认的就好了,这样Context数量限制基本上不会触发。SphU.entry(resourceName, EntryType.IN),这里的资源的唯一标识resourceName也是有限制的,最大是6000。当Sentinel与 Servlet 的整合后,CommonFilter会将所有的对外接口定义成Sentinel的资源,资源名称就是接口地址,所以要控制好服务接口数量。ContextUtil#enter(String name, String origin)的主要作用就是创建当前线程的上下文Context,每个上下文会对应一个EntranceNode(入口节点)实例,通常情况下我们不需要显示调用该方法。name:上下文的唯一标识,也是入口节点的资源名称。orgin:表示来源,通常是服务消费者或调用者的应用名称,当我们需要对不同来源的消费者或调用者进行限制时就会用到这个参数。源码如下:如果我们再代码中显示调用这个方法:那么会创建如下一个树结构图:这里有两点需要注意:也就是上面说的数量限制,2000。ContextUtil是通过ThreadLocal来维护当前线程的上下文的,所以当遇到异步线程时需要手动调用ContextUtil.runOnContext(context, f)方法来完成父线程和子线程的上下文切换。文档中的Demo:Sentinel的核心功能是使用的是责任链模式实现,lookProcessChain(resourceWrapper)的主要作用就是用来构造责任链,源码如下:进一步跟进方法会发现,责任链是由SlotChainBuilder#build()````去构建的,默认实现类是DefaultSlotChainBuilder“`,源码如下:老版本直接是硬编码方式:以下内容来自文档:NodeSelectorSlot: 负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级;ClusterBuilderSlot: 则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据;StatisticSlot: 则用于记录、统计不同纬度的 runtime 指标监控信息;FlowSlot: 则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制;AuthoritySlot: 则根据配置的黑白名单和调用来源信息,来做黑白名单控制;DegradeSlot: 则通过统计信息以及预设的规则,来做熔断降级;SystemSlot: 则通过系统的状态,例如 load1 等,来控制总的入口流量;以上是“A 香港云主机libaba中Sentinel骨架的示例分析”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注开发云行业资讯频道!

相关推荐: MySQL的锁是什么

这篇文章主要介绍“MySQL的锁是什么”,在日常操作中,相信很多人在MySQL的锁是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MySQL的锁是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!当数据库有并发事务的时候…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 08/17 13:47
下一篇 08/17 13:47

相关推荐