[TOC]
Sentinel是什么?
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式服务架构的流量控制组件,主要以流量为切入点,从限流、流量整形、熔断降级、系统负载保护、热点防护等多个维度来帮助开发者保障微服务的稳定性。 --- 来源:(sentinel 官方文档)
Sentinel 基础概念
Sentinel 的流量控制是以资源为单位,先进行数据统计,为流量控制提供基础数据,每个资源都有一个资源名称,在sentinel中主要包含以下概念
-
slot
功能插槽。每个slot负责不同的职责,做不同的事情,职责划分明确,比如 StatisticSlot 用于记录、统计不同纬度的 runtime 指标监控信息;
-
soltChain
功能插槽链,责任链模式构建,对于每一个资源的调用都会涉及不同的规则检查,每个资源都拥有单独的slotChain,保证资源和slotchain一一对应,在请求具体的某个资源的时候,只需要执行对应的资源的slotChain即可
-
Node
Sentinel 里面的各种种类的统计节点, 存放了资源实时的统计信息
-
Entry
每一次资源调用都会创建一个
Entry
, 可以理解为每次进入资源的一个凭证。Entry
包含了资源名、curNode(当前统计节点)、originNode(来源统计节点)等信息 -
Context
Context 代表调用链路上下文,贯穿一次调用链路中的所有
Entry
。Context 维持着入口节点(entranceNode
)、本次调用链路的 curNode、调用来源(origin
)等信息。Context 名称即为调用链路入口名称。Context 维持的方式:通过 ThreadLocal 传递,只有在入口
enter
的时候生效。由于 Context 是通过 ThreadLocal 传递的,因此对于异步调用链路,线程切换的时候会丢掉 Context,因此需要手动通过ContextUtil.runOnContext(context, f)
来变换 context -
Metric
metric是sentinel中用来进行实时数据统计的度量接口,node就是通过metric来进行数据统计的。而metric本身也并没有统计的能力,他也是通过Window来进行统计的。
Sentinel 整体工作流程
Sentinel 的核心骨架,是将不同的Slot按照顺序串在一起(责任链模式),从而将不同的功能(限流、降级、系统保护)组合在一起。slot chain 其实可以分为两部分:统计数据构建部分(statistic)和判断部分(rule checking)
核心骨架结构和流程
Sentinel demo
一个最简单的sentinel demo
- 创建一个调用链的上下文
- 尝试获取一个资源的entry,如果获取到就执行
- 然后退出当前资源,清除掉上下文
// 创建一个名称为entrance1,来源为appA 的上下文Context
ContextUtil.enter("entrance1", "appA");
// 创建一个资源名称nodeA的Entry
Entry nodeA = SphU.entry("nodeA");
if (nodeA != null) {
nodeA.exit();
}
// 清除上下文
ContextUtil.exit();