架构图
整个源码部分以生产环境使用方式为准讲解
- 1.1 Sentinel包含控制台: 配置限流规则[系统规则,权限等]
- 1.2 控制台将规则推送至数据源(zookeeper等)落地
- 1.3 用户进程安装sentinel模块监听zk配置
- 2.1请求进入后交由sentinel-adapter对各模块进行拦截处理
- 2.2 在线程上下文中依据Adapter解析的contextName构建context
- 2.3 根据contextName构建EntranceNode
- 2.4 查找资源ResourceWrapper对应的ProcessorSlotChain
- 2.5 ProcessorSlotChain处理[统计,限流,规则校验等]
对象名 | 解释 |
---|---|
EntranceNode | 入口节点 |
StatisticNode | 统计节点,包含秒级和分钟级两个滑动窗口结构 |
DefaultNode | 链路节点,用于统计调用链路上某个资源的数据,维持树状结构 |
ClusterNode | 簇点链路信息 |
Entry | 每一次Adapter模块资源调用都会创建一个 Entry, 栈式结构[先进入]Entry1->Entry2->Entry3[先退出],包含了资源名、curNode(当前统计节点)等信息资源调用结束时需要entry.exit恢复调用栈 |
Context | 调用链路上下文,维持着入口节点,Entry链路,curNode |
一个context维护请求链路Entry,每个entry都包含node,维护资源之间的树状关系以及限流信息存储
限流原理图
- 限流整个工作机制通过责任链处理
- 每一个资源对应一个ProcessorSlotChain
- 此工作链通过Spi机制发现,用户可以自定义相应实现,并通过@SpiOrder编排优先级
context 与entry关系
- context表示当前线程上下文
- 不同于跨进程追踪,这里我们不考虑跨线程跨进程处理
- 同一个线程内多次资源调用,会形成entry链,context 持有相关链
- context是线程维度.但context的名称是资源ResourceWrapper维度
context 与node关系
- 根据资源名会构建EntranceNode
- context会持有EntranceNode
node自身关系树维护
- 一个线程内多次调用资源限流,则node构成树结构
- entry构成链表栈[先进后出]结构
从请求和资源维度看三者关系
- x轴表示请求,每个请求所在线程构建一个context,但context可能相同,一般为资源名
- 每次创建context会从缓存获取或者构建entranceNode,同一个资源名对应同一个Node
- node本身会构建一个树结构,表示当前统计node树结构限流信息
这也是为什么ProcessorSlotChain是按资源维度实例化,而不是单例模式
因为其中的统计Slot是按照资源维度统计,如果单例化则所有资源的限流统计信息在同一个node
- 上图中Node颜色相同表示同一对象