整体架构
This content is not available in your language yet.
先给答案:Sentinel 的入口、Slot 链、统计节点、规则管理和集群扩展的源码地图
Section titled “先给答案:Sentinel 的入口、Slot 链、统计节点、规则管理和集群扩展的源码地图”Sentinel 的入口、Slot 链、统计节点、规则管理和集群扩展的源码地图。 正文沿“模块地图 -> 核心边界 -> 读码路径”展开:先确认入口和状态归属,再跟踪控制流或数据流的推进,最后落到对外可观察的结果。
主要失效边界集中在“CtSph 不直接实现所有规则,它只负责 Context、Entry 和按资源缓存 Slot 链;DefaultSlotChainBuilder 再通过 SPI 找到有序 Slot”这些场景。它们破坏的是容量、顺序、并发或生命周期前提;排查时应先确认状态是否仍由正确对象持有,再核对推进条件和清理路径。
业务代码 -> SphU / CtSph -> ProcessorSlotChain -> Statistic -> Authority -> System -> Flow -> Degrade -> 可选 ParamFlow / ClusterBuilder 等扩展 -> 业务执行 -> Entry.exit -> 统计 RT、成功、异常、线程数
规则来源: loadRules / SentinelProperty / Dashboard / 外部数据源扩展来源: SpiLoader +-------------------+ | SentinelProperty | +---------+---------+ | +-------------------+-------------------+ v v RuleManager ClusterStateManager | | +------------> Slot 检查 <-------------+ | DefaultNode / \ ClusterNode OriginNodeCtSph 不直接实现所有规则,它只负责 Context、Entry 和按资源缓存 Slot 链;DefaultSlotChainBuilder 再通过 SPI 找到有序 Slot。规则管理器把外部配置转换成资源到规则的索引,Node 只保存运行时事实。
- 从
SphU.entry进入CtSph.entry。 - 在
lookProcessChain看资源级链缓存和上限保护。 - 在
SlotChainProvider与DefaultSlotChainBuilder看 SPI 和顺序。 - 在
StatisticSlot看通过、阻断、异常和退出回写。 - 在
FlowRuleManager、DegradeRuleManager、SystemRuleManager看规则热更新。
为什么这么设计
Section titled “为什么这么设计”替代方案一: 每种规则在 SphU 中写死。问题: 入口会耦合所有治理策略,新策略需要修改核心门面。选择: 入口只组装资源和链,Slot 负责单一检查。
替代方案二: 每次请求重新构造检查器。问题: 规则检查处于热路径,构造和反射成本会被放大。选择: 同一资源共享 ProcessorSlotChain,规则通过可替换管理器读取。
替代方案三: 统计、规则、配置传播使用同一对象。问题: 配置更新会干扰高并发计数。选择: Property 更新规则索引,Node 独立维护窗口统计。
源码坐标索引
Section titled “源码坐标索引”CtSph#entry—sentinel-core/src/main/java/com/alibaba/csp/sentinel/CtSph.java:175CtSph#lookProcessChain—sentinel-core/src/main/java/com/alibaba/csp/sentinel/CtSph.java:194SlotChainProvider#newSlotChain—sentinel-core/src/main/java/com/alibaba/csp/sentinel/slotchain/SlotChainProvider.java:38DefaultSlotChainBuilder#build—sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/DefaultSlotChainBuilder.java:39StatisticSlot#entry—sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/StatisticSlot.java:55StatisticSlot#exit—sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/statistic/StatisticSlot.java:126FlowSlot#entry—sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/flow/FlowSlot.java:160DefaultCircuitBreakerSlot#entry—sentinel-core/src/main/java/com/alibaba/csp/sentinel/slots/block/degrade/DefaultCircuitBreakerSlot.java:41ClusterStateManager#setToClient—sentinel-core/src/main/java/com/alibaba/csp/sentinel/cluster/ClusterStateManager.java:82
- Slot 顺序来自 SPI order,不能只按目录顺序推断;扩展模块可能插入新 Slot。
chainMap按资源缓存,资源名无限增长会触发MAX_SLOT_CHAIN_SIZE保护,超过后请求会跳过规则检查。EntryType.IN与OUT会影响系统规则;不能把所有调用都当作入站流量。
治理框架适合采用“入口门面 + 有序处理链 + 独立事实存储 + 可替换规则源”的结构。这样新增策略只增加处理节点或规则实现,不必改变业务调用协议。
面试锚点:为什么 Sentinel 用 Slot 链?资源级链缓存解决什么问题?规则热更新为什么不直接修改统计节点?