sentinel源码分析-04核心概念介绍

核心概念介绍

Resource

sentinel中的资源类,可以通过注解SentinelResource指定资源,具体的资源类是ResourceWrapper,包装了name和entryType属性,用户可以为需要保护的对象创建一个资源类,然后再配置相对于的规则就可以实现对资源的保护,同时资源和规则是解耦的,而且规则可以在运行时进行修改

Rule

围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。Sentinel 支持以下几种规则:流量控制规则、熔断降级规则、系统保护规则、来源访问控制规则 和 热点参数规则。

流量控制规则 (FlowRule)

重要属性:

Field说明默认值
resource资源名
count限流阈值
grade限流阈值类型,QPS 或线程数模式QPS 模式
limitApp流控针对的调用来源default,代表不区分调用来源
strategy调用关系限流策略:直接、链路、关联根据资源本身(直接)
controlBehavior流控效果(直接拒绝 / 排队等待 / 慢启动模式),不支持按调用关系限流直接拒绝

同一个资源可以同时有多个限流规则

private static void initFlowQpsRule() {
    List<FlowRule> rules = new ArrayList<>();
    FlowRule rule1 = new FlowRule();
    rule1.setResource(resource);
    // Set max qps to 20
    rule1.setCount(20);
    rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
    rule1.setLimitApp("default");
    rules.add(rule1);
    FlowRuleManager.loadRules(rules);
}
熔断降级规则 (DegradeRule)

重要属性:

Field说明默认值
resource资源名,即规则的作用对象
grade熔断策略,支持慢调用比例/异常比例/异常数策略慢调用比例
count慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值
timeWindow熔断时长,单位为 s
minRequestAmount熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入)5
statIntervalMs统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入)1000 ms
slowRatioThreshold慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)

同一个资源可以同时有多个降级规则。

private static void initDegradeRule() {
    List<DegradeRule> rules = new ArrayList<>();
    DegradeRule rule = new DegradeRule(resource);
        .setGrade(CircuitBreakerStrategy.ERROR_RATIO.getType());
        .setCount(0.7); // Threshold is 70% error ratio
        .setMinRequestAmount(100)
        .setStatIntervalMs(30000) // 30s
        .setTimeWindow(10);
    rules.add(rule);
    DegradeRuleManager.loadRules(rules);
}
系统保护规则 (SystemRule)

Sentinel 系统自适应限流从整体维度对应用入口流量进行控制,结合应用的 Load、CPU 使用率、总体平均 RT、入口 QPS 和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性。

系统规则包含下面几个重要的属性:

Field说明默认值
highestSystemLoadload1 触发值,用于触发自适应控制阶段-1 (不生效)
avgRt所有入口流量的平均响应时间-1 (不生效)
maxThread入口流量的最大并发数-1 (不生效)
qps所有入口资源的 QPS-1 (不生效)
highestCpuUsage当前系统的 CPU 使用率(0.0-1.0)-1 (不生效)
访问控制规则 (AuthorityRule)

很多时候,我们需要根据调用方来限制资源是否通过,这时候可以使用 Sentinel 的访问控制(黑白名单)的功能。黑白名单根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。

授权规则,即黑白名单规则(AuthorityRule)非常简单,主要有以下配置项:

  • resource:资源名,即限流规则的作用对象
  • limitApp:对应的黑名单/白名单,不同 origin 用 , 分隔,如 appA,appB
  • strategy:限制模式,AUTHORITY_WHITE 为白名单模式,AUTHORITY_BLACK 为黑名单模式,默认为白名单模式
热点参数规则(ParamFlowRule):
属性说明默认值
resource资源名
count限流阈值
grade限流模式QPS 模式
durationInSec统计窗口时间长度(单位为秒)1s
controlBehavior流控效果(支持快速失败和匀速排队模式)快速失败
maxQueueingTimeMs最大排队等待时长(仅在匀速排队模式生效)0ms
paramIdx热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置
paramFlowItemList参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型
clusterMode是否是集群参数流控规则false
clusterConfig集群流控相关配置
网关限流规则(GatewayFlowRule)
属性说明默认值
resource资源名称,可以是网关中的 route 名称或者用户自定义的 API 分组名称
resourceMode规则是针对 API Gateway 的 route,还是用户在 Sentinel 中定义的 API 分组默认是 route
grade限流模式QPS 模式
count限流阈值
intervalSec统计时间窗口,单位是秒1
controlBehavior流量整形的控制效果,目前支持快速失败和匀速排队两种模式,默认是快速失败。快速失败
burst应对突发请求时额外允许的请求数目
maxQueueingTimeoutMs匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效
paramItem参数限流配置。若不提供,则代表不针对参数进行限流,该网关规则将会被转换成普通流控规则;否则会转换成热点规则

paramItem参数说明

  • parseStrategy:从请求中提取参数的策略,目前支持提取来源 IP、Host、任意 Header和任意 URL 参数四种模式
  • fieldName:若提取策略选择 Header 模式或 URL 参数模式,则需要指定对应的 header 名称或 URL 参数名称
  • pattern:参数值的匹配模式,只有匹配该模式的请求属性值会纳入统计和流控;若为空则统计该请求属性的所有值
  • matchStrategy:参数值的匹配策略,目前支持精确匹配、子串匹配和正则匹配
Context

源码中可以看到解释

/**
 * This class holds metadata of current invocation:<br/>
 *
 * <ul>
 * <li>the {@link EntranceNode}: the root of the current invocation
 * tree.</li>
 * <li>the current {@link Entry}: the current invocation point.</li>
 * <li>the current {@link Node}: the statistics related to the
 * {@link Entry}.</li>
 * <li>the origin: The origin is useful when we want to control different
 * invoker/consumer separately. Usually the origin could be the Service Consumer's app name
 * or origin IP. </li>
 * </ul>
 * <p>
 * Each {@link SphU}#entry() or {@link SphO}#entry() should be in a {@link Context},
 * if we don't invoke {@link ContextUtil}#enter() explicitly, DEFAULT context will be used.
 * A invocation tree will be created if we invoke {@link SphU}#entry() multi times in
 * the same context.
 * Same resource in different context will count separately, see {@link NodeSelectorSlot}.
 */

Context 代表调用链路上下文,贯穿一次调用链路中的所有 Entry, Context 是通过 ThreadLocal 维护的,在异步调用时会丢失context,它维护着当前调用链路的元数据,这个类包含了以下几个核心属性

  • name:名称即为调用链路入口名称
  • entranceNode:当前调用链的入口节点
  • curEntry:当前调用链的调用点
  • origin:当前调用链的调用来源

每次通过SphU.entry()或SphO.entry()时都需要在一个上下文中调用,如果没有则会使用一个默认的context,在一个上下文中多次调用SphU.entry()将会创建一个调用树,不同上下文中的相同资源将单独计数,这个就体现在NodeSelectorSlot类中有一个Map保存了DefaultNode,其中的key就是context的name。也就是不同的上线文对应不同的DefaultNode,针对相同资源会单独统计。

Entry

官方解释是

This class holds information of current invocation

每次资源调用都会创建一个 Entry,这个类包含了当前调用的信息,每次执行SphU.entry()时候如果能正常返回一个entry对象,则表示受保护的资源可以正常访问,否则会抛出一个BlockException标识发生限流。该类包含以下几个属性

  • createTime:创建时间,计算RT时候会用到
  • curNode:当前entry关联的node,记录了当前上下文下资源的统计信息
  • originNode:当前entry的调用来源
  • resourceWrapper:当前entry关联的资源
Node

node是sentinel中的核心概念,sentinel中主要有几种node类型

  • StatisticNode:主要功能就是负责统计各种数据,比如passQps,blockQps,rt等实时数据,包含秒级和分钟级两个滑动窗口结构
  • DefaultNode:链路节点,维度是resource + context。用于统计调用链路上某个资源的数据,维持树状结构,每个资源都关联着一个defaultNode,即使是相同的资源在不同的上下文中也会对应不同的defaultNode
  • ClusterNode:簇点,维度是resource。用于统计每个资源全局的数据不区分调用链路,只关心资源
  • EntranceNode:维度是context,每个上下文的入口节点,直接挂载到root下,对应某个 Context 入口的所有调用数据
  • OriginNode:维度是resource + origin,本身就是StatisticNode,代表了请求来源的信息统计
Metric

StatisticNode就是通过metric类进行数据统计的,他本身只是一层封装,底层还是通过window滑动窗口统计,具体实现是ArrayMetric

Slot

翻译过来就是槽位的意思,slot是sentinel中非常重要的一个概念,这个就是责任链模式的体现,sentinel的工作流程就是围绕着一个个插槽所组成的插槽链来展开的。需要注意的是每个插槽都有自己的职责,他们各司其职完好的配合,通过一定的编排顺序,来达到最终的限流降级的目的。默认的各个插槽之间的顺序是固定的,因为有的插槽需要依赖其他的插槽计算出来的结果才能进行工作但是这并不意味着我们只能按照框架的定义来,sentinel 通过 SlotChainBuilder
作为 SPI 接口,使得 Slot Chain 具备了扩展的能力。我们可以通过实现 SlotsChainBuilder
接口加入自定义的 slot 并自定义编排各个 slot 之间的顺序,从而可以给 sentinel 添加自定义的功能。同时同一个资源会全局共享一个SlotChain执行链。

  • NodeSelectorSlot:负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级;
  • ClusterBuilderSlot:则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据;
  • StatisticSlot:则用于记录、统计不同纬度的 runtime 指标监控信息;
  • FlowSlot:则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制;
  • AuthoritySlot:则根据配置的黑白名单和调用来源信息,来做黑白名单控制;
  • DegradeSlot:则通过统计信息以及预设的规则,来做熔断降级;
  • SystemSlot:则通过系统的状态,来控制总的系统负载;
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
sentinel-dashboard-1.8.2是一个开源的项目,用于监控和管理Sentinel的规则、实时流量、集群节点等信息。它是一个基于Java开发的Web应用程序,采用了Spring Boot框架和Vue.js前端框架。 首先,sentinel-dashboard-1.8.2源码的结构非常清晰和模块化。它分为后端和前端两部分,后端代码位于sentinel-dashboard模块,前端代码位于sentinel-dashboard-frontend模块。这种结构使得代码的维护和扩展变得更加容易。 在后端部分,sentinel-dashboard-1.8.2源码中包含了一系列的Java类,用于实现Sentinel的规则管理、实时数据统计和集群节点的管理等功能。它提供了RESTful的接口用于前端页面的数据获取和交互。这些Java类使用了Spring框架提供的注解和特性,使得代码简洁、易读和易于维护。 在前端部分,sentinel-dashboard-1.8.2源码中的前端代码采用了Vue.js框架进行开发。它使用了一系列的组件来实现不同的功能模块,如规则管理、流量统计、集群节点管理等。前端页面具有良好的交互性和可视化效果,可以方便地进行规则的配置和流量的监控。 另外,sentinel-dashboard-1.8.2源码还使用了一些开源的技术和库,如Redis、MyBatis等,以提供更好的性能和扩展性。 总结来说,sentinel-dashboard-1.8.2源码是一个功能丰富、结构清晰和易于维护的开源项目。通过深入研究和理解源码,开发人员可以对Sentinel的规则管理和流量监控等核心功能有更深入的了解,并根据自己的需求进行二次开发和定制化操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值