Sentinel 介绍和整体骨架

206 阅读3分钟

[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)

核心骨架结构和流程

image-20201014104204886

Sentinel demo

一个最简单的sentinel demo

  1. 创建一个调用链的上下文
  2. 尝试获取一个资源的entry,如果获取到就执行
  3. 然后退出当前资源,清除掉上下文
// 创建一个名称为entrance1,来源为appA 的上下文Context
ContextUtil.enter("entrance1", "appA");
// 创建一个资源名称nodeA的Entry
 Entry nodeA = SphU.entry("nodeA");
 if (nodeA != null) {
    nodeA.exit();
 }
 // 清除上下文
 ContextUtil.exit();