Sentinel 流程分析

最近公司开始作新的项目。新项目准备用点新的技术。以前咱们采用的是spring cloud的那一套。以前几个月看到阿里开始拥抱springcloud,推出好几个组件无缝兼容现有springcloud。我尤为喜欢Sentinel 的qps控制。这是以前Hystrix所缺失的。因此此次准备试下阿里的这套springcloud。java

Sentinel 的文档写的很是详细,基本上咱们把Sentinel 的项目clone下来,对着文档用一遍就会使用了。关于使用方面的咱们能够看这里  https://github.com/alibaba/Sentinel/wiki/如何使用git

今天咱们主要看一下Sentinel 的大体流程。github

程序的入口咱们就从 com.alibaba.csp.sentinel.demo.authority.AuthorityDemo 这个类开始 spring

核心代码以下app

这行代码  ContextUtil.enter(resource, origin);框架

是创建调用上下文ui

在执行完  entry = SphU.entry(resource); 代码以后在内存中生成如下结构:3d

      machine-root
                 /     
                /
         EntranceNode1
              /
             /   
      DefaultNode(resource)

咱们的重点就是这行代码。一直点进去直到 com.alibaba.csp.sentinel.CtSph#entryWithPriority 方法code

在分析这个方法以前呢。咱们首先要了解下Sentinel的slotblog

 

在 Sentinel 里面,全部的资源都对应一个资源名称以及一个 Entry。Entry 能够经过对主流框架的适配自动建立,也能够经过注解的方式或调用 API 显式建立;每个 Entry 建立的时候,同时也会建立一系列功能插槽(slot chain)。这些插槽有不一样的职责,例如:

NodeSelectorSlot 负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级;
ClusterBuilderSlot 则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用做为多维度限流,降级的依据;
StatisticSlot 则用于记录、统计不一样纬度的 runtime 指标监控信息;
FlowSlot 则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制;
AuthoritySlot 则根据配置的黑白名单和调用来源信息,来作黑白名单控制;
DegradeSlot 则经过统计信息以及预设的规则,来作熔断降级;
SystemSlot 则经过系统的状态,例如 load1 等,来控制总的入口流量;

 因此实际上Sentinel是经过这些插槽实现了他的功能。如今咱们再看上面的方法。ProcessorSlot<Object> chain = lookProcessChain(resourceWrapper); 这行代码即是获取插槽

 

 咱们重点须要关注 newSlotChain 方法是如何建立SlotChain的

初始化的时候builder仍是null,因此会执行 resolveSlotChainBuilder。resolveSlotChainBuilder主要是为了扩展使用的

Sentinel经过SPI机制扩展 SlotChainBuilder,因此未来咱们能够经过这种方法自定义Sentinel。resolveSlotChainBuilder方法执行完成后默认返回的是DefaultSlotChainBuilder,他就会去构造出整个slot责任链

拿到 slot责任链以后咱们咱们回到最初的代码

如今开始咱们就能够去执行每一个slot的逻辑。

每一个slot的结构都同样,咱们已AuthoritySlot为例

 

方法 checkBlackWhiteAuthority 是AuthoritySlot的核心逻辑。

首先经过AuthorityRuleManager获取获得全部的规则,AuthorityRuleManager是受权规则的管理类,能够动态获取从dashboard增长的规则。

而后调用AuthorityRuleChecker的pass方法进行受权规则的校验,若是返回false说明被拦截了,则抛出一个异常

若是一切顺利则会执行fireEntry去调用下一个slot的方法

就这样,Sentinel经过slot实现了相应的功能,同时使用了SPI的机制,使咱们个性化定制Sentinel很是容易

相关文章
相关标签/搜索