• Sentinel 流程分析


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

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

    今天我们主要看一下Sentinel 的大致流程。

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

    核心代码如下

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

    是建立调用上下文

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

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

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

    在分析这个方法之前呢。我们首先要了解下Sentinel的slot

    在 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非常容易

  • 相关阅读:
    测试AtomicInteger的可见性、有序性、原子性
    java实现hssf导出excel文件及自定义选择路径工具类
    map转换成com.google.gson.JsonObject
    String[]转List<String>
    classLoader打破双亲委托机制
    类加载器的加密解密
    自定义类加载器和父委托机制
    java中获取项目路径
    JVM内置三大类加载器详细介绍
    初识继承和多态
  • 原文地址:https://www.cnblogs.com/xmzJava/p/10597014.html
Copyright © 2020-2023  润新知