Sentinel源码分析

Sentinel

核心API-Sentinel-core

Node

Node:数据统计API接口

StatisticNode:实现Node,使用滑动窗口实现数据统计

DefaultNode:继承StatisticNode,关联资源、关联集群ClusterNode、持有一系列子节点

EntranceNode:继承DefaultNode,qps,总数等会使用子节点参与计算

ClusterNode:统一资源的全局统计点,维护originCountMap

上下文

Context:维护当前执行上下文信息,关联一个入口node,创建上下文时自动创建并加入到ROOT下

ContextUtil:ThreadLocal维护Context,使用Map维护名称和上下文,默认创建了sentinel_default_context上下文,没指定时进入该上下文

用户接口

Sph:定义资源进出方法

CtSph:实现Sph,维护ProcessorSlotChain,每个资源不同的ProcessorSlotChain

SphO:调用返回boolean结果

SphU:调用抛出异常

核心处理流程

ProcessorSlot:处理器槽,用于不同的业务处理,默认家在的插槽,自带责任链职责触发函数

com.alibaba.csp.sentinel.slots.nodeselector.NodeSelectorSlot
com.alibaba.csp.sentinel.slots.clusterbuilder.ClusterBuilderSlot
com.alibaba.csp.sentinel.slots.logger.LogSlot
com.alibaba.csp.sentinel.slots.statistic.StatisticSlot
com.alibaba.csp.sentinel.slots.system.SystemSlot
com.alibaba.csp.sentinel.slots.block.authority.AuthoritySlot
com.alibaba.csp.sentinel.slots.block.flow.FlowSlot
com.alibaba.csp.sentinel.slots.block.degrade.DegradeSlot

ProcessorSlotChain:ProcessorSlot实现,维护链结构

DefaultProcessorSlotChain:维护首位节点指针,只负责传递事件

Entry:维护当前入点信息

CtEntry:维护当前的上下文和处理器槽链

NodeSelectorSlot:维护上下文和DefaultNode的map,根据上下文名称创建并设置当前node

ClusterBuilderSlot:维护资源和ClusterNode的map,根据资源创建并设置上一步node的ClusterNode,同时当前Slot是资源独有的,直接维护ClusterNode成员。如果上下文设置了来源,此处创建来源节点并设置

LogSlot:使用EagleEyeLogUtil记录阻塞异常

StatisticSlot:实时统计处理槽,对node进行实时技术,并触发回调StatisticSlotCallbackRegistry

1、2为Node初始化插槽,4为Node统计插槽,顺序固定而且必须存在,3配合鹰眼系统使用

SystemSlot:系统规则检查,使用SystemRuleManager完成检查

Rule:规则基本接口,定义是否能通过规则校验

AbstractRule:资源和limitApp维护

SystemRule:定义系统插槽检查

SystemRuleManager:管理系统规则,SystemRule只是为SystemRuleManager提供属性值,自己并不处理规则,也就是逻辑写在SystemRuleManager里面

AuthoritySlot:认证处理器槽,使用AuthorityRuleManager、AuthorityRule、AuthorityRuleChecker

FlowSlot:流控处理器槽,使用FlowRuleChecker、FlowRule、FlowRuleManager

DegradeSlot:降级处理器槽:使用DegradeRuleManager、DegradeRule

Env

  • 维护全局CtSph实例
  • 进行InitExecutor初始化调用,初始化SPI的InitFunc函数。其他扩展点都可以使用这个实现,比如与控制台远程通信的CommandCenterInitFunc和HeartbeatSenderInitFunc

sentinel-transport-common

  • 使用上面提到的InitFunc初始化心跳上报客户端和命令执行客户端
  • 定义通用接口和命令
  • 命令执行主要使用Manager加载新规则

sentinel-transport-simple-http和sentinel-transport-netty-http

  • 心跳和命令的具体实现
  • simple使用bio实现,netty的基于netty实现命令客户端,使用httpclient实现心跳
posted @ 2020-08-25 10:11  java拌饭  阅读(392)  评论(0编辑  收藏  举报