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非常容易
Sentinel 流程分析的更多相关文章
- 8、Struts2 运行流程分析
1.流程分析: 请求发送给 StrutsPrepareAndExecuteFilter StrutsPrepareAndExecuteFilter 询问 ActionMapper: 该请求是否是一个 ...
- freeswitch呼叫流程分析
今天翻文档时发现之前整理的关于freeswitch呼叫相关的内容,写成博文分享出来也方便我以后查阅. 整体结构图 FreeswitchCore 模块加载过程 freeswitch主程序初始化时会从mo ...
- u-boot 流程分析
u-boot 介绍: 对于计算机来说 , 从一开始上机通电是无法直接启动操作系统的 , 这中间需要一个引导过程 , 嵌入式Linux系统同样离不开引导程序 , 这个启动程序就叫启动加载程序(Boot ...
- thttpd和cgilua安装与运行流程分析
安装 参考如下博文安装thttpd软件 http://blog.csdn.net/21aspnet/article/details/7045845 http://blog.csdn.net/drago ...
- 【转】Hostapd工作流程分析
[转]Hostapd工作流程分析 转自:http://blog.chinaunix.net/uid-30081165-id-5290531.html Hostapd是一个运行在用户态的守护进程,可以通 ...
- u-boot中nandflash初始化流程分析(转)
u-boot中nandflash初始化流程分析(转) 原文地址http://zhuairlunjj.blog.163.com/blog/static/80050945201092011249136/ ...
- Android7.0 Phone应用源码分析(二) phone来电流程分析
接上篇博文:Android7.0 Phone应用源码分析(一) phone拨号流程分析 今天我们再来分析下Android7.0 的phone的来电流程 1.1TelephonyFramework 当有 ...
- runc start container流程分析
1.runc/start.go Action: func(context *cli.Context) error 该函数首先调用container, err := getContainer(conte ...
- 从注册流程 分析如何安全退出多个Activity 多种方式(附DEMO)
退出Activity注册Android遍历 目录(?)[+] 前言 知识结构 具体方案 方案1 方法采用FLAG_ACTIVITY_CLEAR_TOP退出整个程序多activity 方案2 方 ...
随机推荐
- 新版知乎登录之post请求
前言 在上一篇文章中给大家讲解了requests发送post请求的几种方式,并分析了一些使用陷阱. 疑惑 在文章发表之后,有朋友给我留言说,知乎登录就没有使用提交Form表单(application/ ...
- [Poi2014]FarmCraft 树状dp
对于每个点,处理出走完其子树所需要的时间和其子树完全下载完软件的时间 易证,对于每个点的所有子节点,一定优先选择差值大的来给后面的时间 树规+贪心. #include<cstdio> #i ...
- 浅谈HTTP协议
1 HTTP概念 把握三个点: 1 HTTP协议(超文本传输协议) HTTP是一个基于TCP/IP通信协议来传递数据,默认端口80 2 HTTP是无连接(限制每次连接只处理一个请求),无状态的(对于事 ...
- wGenerator如何编写模板
编写模板大致分为4个步骤: 确定开发语言与数据库类型 分析表数据类型与语言的类型对应 分析代码中哪些可以规整为模板 编写与测试模板 我们对照流程图看的话会更加清晰: 1.如何分析表数据与开发语言的类型 ...
- python接口自动化(十六)--参数关联接口后传(详解)
简介 大家对前边的自动化新建任务之后,接着对这个新建任务操作了解之后,希望带小伙伴进一步巩固胜利的果实,夯实基础.因此再在沙场实例演练一下博客园的相关接口.我们用自动化发随笔之后,要想接着对这篇随笔操 ...
- 我不是bug神(JVM问题排查)
Story background 回望2018年12月,这也许是程序员们日夜不得安宁的日子,皆因各种前线的系统使用者都需要冲业绩等原因,往往在这个时候会向系统同时写入海量的数据,当我们的应用或者数据库 ...
- BugkuCTF~Mobile~WriteUp
最近,开始记录一篇关于 Android 逆向分析的 WriteUp 方便有需要的人学习,也欢迎大家相互交流, 发现不 一样的世界. 一. signin 考点:反编译.静态分析 Topic Link:h ...
- matplotlib读取csv文件
一,从本地加载csv文件 from matplotlib import pyplot as pltimport numpy as npimport csv#用来正常显示中文标签plt.rcParams ...
- Cenots7下安装运行.NET Core、MicroSoft SQL Server 2019 preview 的基础实践
一:概要 适应人群:.Net初学者.想了解.Net Core在Linux系统中的运行环境搭建者.初次且想在linux上应用.Net Core开发应用程序者: 基础技能:了解.NET基础开发技能者.有一 ...
- SuperMap iObject入门开发系列之二地下三维管线系统介绍
本文是一位好友“托马斯”授权给我来发表的,介绍都是他的研究成果,在此,非常感谢. 上次对超图平台组件式开发进行介绍,这次介绍的是基于这个框架开发的地下三维管线系统.地下管线涉及给水.雨水.污水.燃气. ...