最近公司开始做新的项目。新项目准备用点新的技术。之前我们采用的是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); 代码之后在内存中生成以下结构:

  1.       machine-root
  2. /
  3. /
  4. EntranceNode1
  5. /
  6. /
  7. DefaultNode(resource)

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

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

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

  1. NodeSelectorSlot 负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级;
  2. ClusterBuilderSlot 则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据;
  3. StatisticSlot 则用于记录、统计不同纬度的 runtime 指标监控信息;
  4. FlowSlot 则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制;
  5. AuthoritySlot 则根据配置的黑白名单和调用来源信息,来做黑白名单控制;
  6. DegradeSlot 则通过统计信息以及预设的规则,来做熔断降级;
  7. 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非常容易

Sentinel 流程分析的更多相关文章

  1. 8、Struts2 运行流程分析

    1.流程分析: 请求发送给 StrutsPrepareAndExecuteFilter StrutsPrepareAndExecuteFilter 询问 ActionMapper: 该请求是否是一个 ...

  2. freeswitch呼叫流程分析

    今天翻文档时发现之前整理的关于freeswitch呼叫相关的内容,写成博文分享出来也方便我以后查阅. 整体结构图 FreeswitchCore 模块加载过程 freeswitch主程序初始化时会从mo ...

  3. u-boot 流程分析

    u-boot 介绍: 对于计算机来说 , 从一开始上机通电是无法直接启动操作系统的 , 这中间需要一个引导过程 , 嵌入式Linux系统同样离不开引导程序 ,  这个启动程序就叫启动加载程序(Boot ...

  4. thttpd和cgilua安装与运行流程分析

    安装 参考如下博文安装thttpd软件 http://blog.csdn.net/21aspnet/article/details/7045845 http://blog.csdn.net/drago ...

  5. 【转】Hostapd工作流程分析

    [转]Hostapd工作流程分析 转自:http://blog.chinaunix.net/uid-30081165-id-5290531.html Hostapd是一个运行在用户态的守护进程,可以通 ...

  6. u-boot中nandflash初始化流程分析(转)

    u-boot中nandflash初始化流程分析(转) 原文地址http://zhuairlunjj.blog.163.com/blog/static/80050945201092011249136/ ...

  7. Android7.0 Phone应用源码分析(二) phone来电流程分析

    接上篇博文:Android7.0 Phone应用源码分析(一) phone拨号流程分析 今天我们再来分析下Android7.0 的phone的来电流程 1.1TelephonyFramework 当有 ...

  8. runc start container流程分析

    1.runc/start.go Action: func(context *cli.Context) error 该函数首先调用container, err := getContainer(conte ...

  9. 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)

      退出Activity注册Android遍历   目录(?)[+] 前言 知识结构 具体方案 方案1 方法采用FLAG_ACTIVITY_CLEAR_TOP退出整个程序多activity 方案2 方 ...

随机推荐

  1. acl.go

    package acl   import ( "github.com/armon/go-radix" )   var ( // allowAll is a singleton po ...

  2. 【bzoj 4173】数学

    Description Input 输入文件的第一行输入两个正整数 . Output 如题 Sample Input 5 6 Sample Output 240 HINT N,M<=10^15 ...

  3. BZOJ_3048_[Usaco2013 Jan]Cow Lineup _双指针

    BZOJ_3048_[Usaco2013 Jan]Cow Lineup _双指针 Description Farmer John's N cows (1 <= N <= 100,000) ...

  4. CentOS7 通过YUM安装MySQL5.7

    1.进入到要存放安装包的位置 cd /home/lnmp 2.查看系统中是否已安装 MySQL 服务,以下提供两种方式: rpm -qa | grep mysql yum list installed ...

  5. 单台PC玩转NEUTRON(一:环境准备)

    要开始从事云计算网络领域的技术研究.过去10年一直是从事传统网络相关的工作,新的事务在知识结构上还有一些差异,边学边写,作为个人总结,也共享给大家. 工欲善其事必先利其器,好的开发调测环境让人学习工作 ...

  6. java接口变量问题

    java中接口是不能实例化的,然而像下面这种用法是可以的: List<FileItem> items = upload.parseRequest(request); Iterator< ...

  7. linux 文本编辑 软件管理

    gerp 命令 : grep是强大的文本搜索工具,它对文本文件逐行查看,如果找到匹配的模式,就会打印出包含此模式的所有行,并且grep支持正则表达式 1  grep 选项 模式 被查找文件 : gre ...

  8. Gradle入门到实战(一) — 全面了解Gradle

    声明:本文来自汪磊的博客,转载请注明出处 可关注个人公众号,那里更新更及时,阅读体验更好:  友情提示由于文章是从个人公众号拷贝过来整理的,发现图片没有正常显示,没关注公众号的同学可通过如下链接查看: ...

  9. (翻译)W3C的Turtle文档

    主要翻译如下页面,https://www.w3.org/TR/turtle/,对该页面中Turtle的内容部分进行翻译,希望对使用Turtle的朋友们有所帮助. 1 简介 2 Turtle语言 2.1 ...

  10. with管理文件操作上下文

    目录 with管理文件操作上下文(掌握) with管理文件操作上下文(掌握) 之前我们使用open()方法操作文件,但是open打开文件后我们还需要手动释放文件对操作系统的占用.但是其实我们可以更方便 ...