Spring Cloud Alibaba Sentinel如何实现SlotChain链式流程概览?

2026-05-21 03:543阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1405个文字,预计阅读时间需要6分钟。

Spring Cloud Alibaba Sentinel如何实现SlotChain链式流程概览?

前言:Sentinel作为阿里开源的一款轻量级流控框架,主要以其流量控制为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保障服务的稳定性。相较于Hystrix,Sentinel的设计更加注重流控的灵活性和高效性。

前言

Sentinel作为ali开源的一款轻量级流控框架,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。相比于Hystrix,Sentinel的设计更加简单,在 Sentinel中资源定义和规则配置是分离的,也就是说用户可以先通过Sentinel API给对应的业务逻辑定义资源(埋点),然后在需要的时候再配置规则,通过这种组合方式,极大的增加了Sentinel流控的灵活性。

 

引入Sentinel带来的性能损耗非常小。只有在业务单机量级超过25W QPS的时候才会有一些显著的影响(5% - 10% 左右),单机QPS不太大的时候损耗几乎可以忽略不计。

 

Sentinel提供两种埋点方式:

Spring Cloud Alibaba Sentinel如何实现SlotChain链式流程概览?

  • try-catch 方式(通过 SphU.entry(...)),用户在 catch 块中执行异常处理 / fallback

  • if-else 方式(通过 SphO.entry(...)),当返回 false 时执行异常处理 / fallback

写在前面

在此之前,需要先了解一下Sentinel的工作流程。

 

在 Sentinel 里面,所有的资源都对应一个资源名称(resourceName),每次资源调用都会创建一个 Entry 对象。Entry 可以通过对主流框架的适配自动创建,也可以通过注解的方式或调用 SphU API 显式创建。Entry 创建的时候,同时也会创建一系列功能插槽(slot chain),这些插槽有不同的职责,例如默认情况下会创建以下7个插槽:

  • NodeSelectorSlot:负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级。

  • ClusterBuilderSlot:则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据。

  • StatisticSlot:则用于记录、统计不同纬度的 runtime 指标监控信息。

  • SystemSlot:则通过系统的状态,例如 load1 等,来控制总的入口流量。

  • AuthoritySlot:则根据配置的黑白名单和调用来源信息,来做黑白名单控制。

  • FlowSlot:则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制。

  • DegradeSlot:则通过统计信息以及预设的规则,来做熔断降级。

注意:这里的插槽链都是一一对应资源名称的。

 

每个Slot执行完业务逻辑处理后,会调用fireEntry()方法,该方法将会触发下一个节点的entry方法,下一个节点又会调用他的fireEntry,以此类推直到最后一个Slot,由此就形成了Sentinel的责任链。

 

上面的所介绍的插槽(slot chain)是Sentinel非常重要的概念。同时还有一个非常重要的概念那就是Node。

Node之间的树形结构

在创建context会先创建DefaultNode 实际是它的父类EntranceNode,context可以相同context-name反复申明创建,但是DefaultNode同一context-name只会创建一次,DefaultNode包含了一个链路所有的资源,每一个资源对应一个ClusterNode,ClusterNode再根据来源细分为StatisticNode,它们之间的关系就是一个树形结构 如下:

  • EntranceNode:根据context-name来创建,就算同一个context-name多次创建context,entranceNode也只会创建一次, 用来统计该链路上所有的资源信息。

  • DefaultNode:根据context-name + resource-name创建,用来统计某链路上的资源信息。

  • ClusterNode:根据resource-name来创建,用来统计资源信息。

  • StatisticsNode:根据origin-name+resource-name来创建,针对请求来源统计该来源的资源信息,上面几个node都是它的子类,基于它的数据做汇总。

一定要搞清楚这几个node之间的关系和作用,下面重点来看StatisticsNode,它用来完成信息统计,以供后续的限流规则使用, 它只统计了两个维度数据,qps和线程数。

入门案例

  • 引入maven依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.12.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <!--整合Spring Cloud Alibaba--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.6.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
  • 下面举一个最简单的案例埋点来引出流控入口
public String getOrderInfo(String orderNo) { ContextUtil.enter("getOrderInfo", "application-a"); Entry entry = null; try { // name:资源名 EntryType 流量类型为入口还是出口,系统规则只针对入口流量, batchCount:当前请求流量, args:参数 entry = SphU.entry("getOrderInfo", EntryType.IN, 1, orderNo); getUserInfo(); } catch (BlockException e) { e.printStackTrace(); } finally { entry.exit(); } return "orderInfo = " + orderNo; } public String getUserInfo() { Entry entry = null; try { entry = SphU.entry("getUserInfo", EntryType.OUT, 1); // 通过www.cnblogs.com/taromilk/p/11750962.html

www.cnblogs.com/zzz-blogs/p/14342608.html

blog.csdn.net/qq_19414183/article/details/111035989

blog.csdn.net/wk52525/article/details/104439404

本文共计1405个文字,预计阅读时间需要6分钟。

Spring Cloud Alibaba Sentinel如何实现SlotChain链式流程概览?

前言:Sentinel作为阿里开源的一款轻量级流控框架,主要以其流量控制为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保障服务的稳定性。相较于Hystrix,Sentinel的设计更加注重流控的灵活性和高效性。

前言

Sentinel作为ali开源的一款轻量级流控框架,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助用户保护服务的稳定性。相比于Hystrix,Sentinel的设计更加简单,在 Sentinel中资源定义和规则配置是分离的,也就是说用户可以先通过Sentinel API给对应的业务逻辑定义资源(埋点),然后在需要的时候再配置规则,通过这种组合方式,极大的增加了Sentinel流控的灵活性。

 

引入Sentinel带来的性能损耗非常小。只有在业务单机量级超过25W QPS的时候才会有一些显著的影响(5% - 10% 左右),单机QPS不太大的时候损耗几乎可以忽略不计。

 

Sentinel提供两种埋点方式:

Spring Cloud Alibaba Sentinel如何实现SlotChain链式流程概览?

  • try-catch 方式(通过 SphU.entry(...)),用户在 catch 块中执行异常处理 / fallback

  • if-else 方式(通过 SphO.entry(...)),当返回 false 时执行异常处理 / fallback

写在前面

在此之前,需要先了解一下Sentinel的工作流程。

 

在 Sentinel 里面,所有的资源都对应一个资源名称(resourceName),每次资源调用都会创建一个 Entry 对象。Entry 可以通过对主流框架的适配自动创建,也可以通过注解的方式或调用 SphU API 显式创建。Entry 创建的时候,同时也会创建一系列功能插槽(slot chain),这些插槽有不同的职责,例如默认情况下会创建以下7个插槽:

  • NodeSelectorSlot:负责收集资源的路径,并将这些资源的调用路径,以树状结构存储起来,用于根据调用路径来限流降级。

  • ClusterBuilderSlot:则用于存储资源的统计信息以及调用者信息,例如该资源的 RT, QPS, thread count 等等,这些信息将用作为多维度限流,降级的依据。

  • StatisticSlot:则用于记录、统计不同纬度的 runtime 指标监控信息。

  • SystemSlot:则通过系统的状态,例如 load1 等,来控制总的入口流量。

  • AuthoritySlot:则根据配置的黑白名单和调用来源信息,来做黑白名单控制。

  • FlowSlot:则用于根据预设的限流规则以及前面 slot 统计的状态,来进行流量控制。

  • DegradeSlot:则通过统计信息以及预设的规则,来做熔断降级。

注意:这里的插槽链都是一一对应资源名称的。

 

每个Slot执行完业务逻辑处理后,会调用fireEntry()方法,该方法将会触发下一个节点的entry方法,下一个节点又会调用他的fireEntry,以此类推直到最后一个Slot,由此就形成了Sentinel的责任链。

 

上面的所介绍的插槽(slot chain)是Sentinel非常重要的概念。同时还有一个非常重要的概念那就是Node。

Node之间的树形结构

在创建context会先创建DefaultNode 实际是它的父类EntranceNode,context可以相同context-name反复申明创建,但是DefaultNode同一context-name只会创建一次,DefaultNode包含了一个链路所有的资源,每一个资源对应一个ClusterNode,ClusterNode再根据来源细分为StatisticNode,它们之间的关系就是一个树形结构 如下:

  • EntranceNode:根据context-name来创建,就算同一个context-name多次创建context,entranceNode也只会创建一次, 用来统计该链路上所有的资源信息。

  • DefaultNode:根据context-name + resource-name创建,用来统计某链路上的资源信息。

  • ClusterNode:根据resource-name来创建,用来统计资源信息。

  • StatisticsNode:根据origin-name+resource-name来创建,针对请求来源统计该来源的资源信息,上面几个node都是它的子类,基于它的数据做汇总。

一定要搞清楚这几个node之间的关系和作用,下面重点来看StatisticsNode,它用来完成信息统计,以供后续的限流规则使用, 它只统计了两个维度数据,qps和线程数。

入门案例

  • 引入maven依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.12.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <!--整合Spring Cloud Alibaba--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.6.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
  • 下面举一个最简单的案例埋点来引出流控入口
public String getOrderInfo(String orderNo) { ContextUtil.enter("getOrderInfo", "application-a"); Entry entry = null; try { // name:资源名 EntryType 流量类型为入口还是出口,系统规则只针对入口流量, batchCount:当前请求流量, args:参数 entry = SphU.entry("getOrderInfo", EntryType.IN, 1, orderNo); getUserInfo(); } catch (BlockException e) { e.printStackTrace(); } finally { entry.exit(); } return "orderInfo = " + orderNo; } public String getUserInfo() { Entry entry = null; try { entry = SphU.entry("getUserInfo", EntryType.OUT, 1); // 通过www.cnblogs.com/taromilk/p/11750962.html

www.cnblogs.com/zzz-blogs/p/14342608.html

blog.csdn.net/qq_19414183/article/details/111035989

blog.csdn.net/wk52525/article/details/104439404