阿里 sentinel —— core 模块浅析

本文深入介绍了阿里巴巴开源的流量控制组件Sentinel,包括其核心概念如resource、context、slot和slotChain,以及Sentinel的扩展点如InitFunc、MetricExtension。Sentinel通过不同slot实现限流、降级、系统负载保护等功能,提供丰富的资源管理和保护策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 什么是 Sentinel

  • Sentinel 是 2018 年, 阿里开源的一个轻量级流量控制组件
  • 它以流量为切入点,从限流、熔断降级、系统负载等多个维度来保证服务端的稳定性
    • 限流(flowslot):指定某个接口最大 QPS 或 最大并发线程数,当超过指定值时,会采用几种限流策略
      • 通过 FlowRule.controlBehavior 字段指定
      • 直接拒绝(0)
      • 预热(1):当突然有大流量来时,会逐渐提高流量限制的阈值,最终才达到指定值。用来应对服务端初始化资源时和初始化资源后,它的流量负载能力不一样的场景
      • 流量规整(2):使得流量按规定的 QPS 进入资源,其余的等待(有最大等待时间)
      • 预热 + 流量规整(3)
    • 熔断降级(degradeslot):当某个资源的平均响应时间或异常比例超过指定值时拒绝请求
    • 系统负载:当应用的 QPS、并发线程数、CPU 使用率、平均响应时间等达到指定值时拒绝请求

2 Sentinel 核心概念简介

2.1 resource
  • 资源是对受保护的某一方法或代码块的唯一标识,用 resourceName 来表示
2.2 context
  • 用 context 来构成资源调用的链路
2.3 slot
  • 它是 Sentinel 功能实现的核心,通过不同的 slot 来做不同维度的保护,如 flowSlot 做限流保护、degradeSlot 做熔断降级保护、paramSlot 做热点参数限流保护、systemSlot 做系统负载保护、statisticSlot 收集 Metrics 数据等
2.4 slotChain
  • 由多个 slot 串联成的一个调用链,这样使得所有定义的 slot 按一定的顺序执行
2.5 slotChainBuilder
  • 通过不同的 slotChainBuilder 来创建不同的 slotChain,默认为 DefaultSlotChainBuilder,可以通过 SPI 接口扩展自定义的 slotChainBuilder
2.6 Node
  • 通过不同的 Node 收集 Metrics 数据,各个 Slot 就是使用 Node 中的数据来做保护判断的,如 QPS、并发线程数都被实时的收集在不同的 Node 中

3 Sentinel 扩展点

3.1 InitFunc
  • 通过实现 InitFunc 接口,并且在 META-INF/services 目录下的 com.alibaba.csp.sentinel.init.InitFunc 文件中指定该实现类全名
  • 当第一次资源调用的时候,就会通过 Env 类中的 static 块加载到,并且运行 init 方法
  • 所以我们可以在项目中创建 InitFunc 实例,并指定
    • 如通过 InitFunc 实例来初始化配置数据源
    • 如 sentinel-parameter-flow-control 包中就通过此扩展点注册了 ParamFlowStatisticEntryCallback 和 ParamFlowStatisticExitCallback
3.2 StatisticSlotCallbackRegistry
  • StatisticSlot 中会调用此类来获取所有的 SlotEntryCallback、SlotExitCallback 实例 的 onPass、onBlocked 、onExit 来处理其他的一些成功或阻塞后的一些逻辑
  • 如 ParamFlowStatisticCallback 来处理热点参数的线程数信息
  • 注册动作可以通过 InitFunc 方式来添加 Callback 实例
3.3 SlotChainBuilder
  • 通过实现 SlotChainBuilder 接口,并且在 META-INF/services 目录下的 com.alibaba.csp.sentinel.slotchain.SlotChainBuilder 文件中指定该实现类全名
  • 当第一次资源调用的时候,就会通过 SlotChainProvider 类加载此文件中指定的类,如果有多个实例,就会选取一个最为唯一的 SlotChainBuilder 类
  • 所以我们可以在项目中创建 SlotChainBuilder 实例,并指定
    • 如我们需要自定义某种 slot,那就需要通过自定义 SlotChainBuilder 来将我们定义的 slot 加入到 slotChain 中
    • 如 sentinel-parameter-flow-control 包中就通过此扩展点实现了 HotParamSlotChainBuilder,将 ParmaFlowSlot 加入到 slotChain 中
3.4 MetricExtension
  • 通过实现 MetricExtension 接口,并且在 META-INF/services 目录下的 com.alibaba.csp.sentinel.metric.extension.MetricExtension 文件中指定该实现类全名
  • 当第一次资源调用的时候,就会通过 MetricExtensionProvider 类加载此文件中指定的类,并放入 metricExtensions 列表中
  • 目前 在 MetricEntryCallback、MetricExitCallback 中就会调用所有的 MetricExtension 实例
  • 作用:可以通过它对 statistic 做扩展

4 Slot 简介

4.1 NodeSelectorSlot
  • 生成 contextName 对应的 resource 属性,并存入 map 中
    • 此 map 为 实例属性,又因为 一个 slot 实例对应一个 resourceName
    • 所以这个 map 存储的是
### 阿里Sentinel作为Spring Cloud第二代熔断器的使用方法和功能介绍 阿里Sentinel阿里巴巴开源的一款高可用微服务组件,主要关注流量控制、熔断降级以及系统负载保护等多个维度,确保服务在高并发场景下的稳定性[^2]。Spring Cloud Alibaba 提供了对 Sentinel 的支持,使其能够与 Spring Cloud 生态无缝集成,成为第二代熔断器解决方案之一。 #### 功能介绍 1. **流量控制** Sentinel 提供了基于 QPS(每秒查询数)、线程数等多种维度的限流策略,可以有效防止突发流量对服务造成冲击。通过配置规则,用户可以限制某个接口或服务的最大访问量,超出部分会被直接拒绝或进行排队等待处理[^4]。 2. **熔断降级** 当某些依赖的服务出现异常或者响应时间过长时,Sentinel 能够自动触发熔断机制,快速失败并返回默认值或降级逻辑,从而避免故障扩散到整个系统。 3. **系统负载保护** 除了针对单个资源的保护外,Sentinel 还提供了从整体系统的角度出发的保护策略。例如,当机器的 CPU 使用率超过设定阈值时,会自动降低非核心业务的优先级,以保证核心业务的正常运行[^1]。 4. **实时监控与动态规则调整** Sentinel 提供了一个可视化的控制台,用户可以通过该界面查看当前系统的流量情况、资源消耗等信息,并且支持在线修改限流规则而无需重启应用。 #### 使用方法 以下是将阿里 Sentinel 集成到 Spring Cloud 工程中的具体步骤: 1. **添加依赖** 在项目的 `pom.xml` 文件中引入 Spring Cloud Alibaba Sentinel 的 Starter 依赖: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> </dependency> ``` 这一步确保了项目具备 Sentinel 的基础功能[^3]。 2. **配置文件设置** 在 `application.yml` 或 `application.properties` 中添加必要的配置项,例如是否开启 Sentinel 控制台、指定控制台地址等: ```yaml spring: cloud: sentinel: transport: dashboard: localhost:8080 # Sentinel 控制台地址 ``` 3. **定义限流规则** 可以通过代码编程的方式定义限流规则,例如以下示例展示了如何为一个方法设置基于 QPS 的限流规则: ```java import com.alibaba.csp.sentinel.Entry; import com.alibaba.csp.sentinel.SphU; import com.alibaba.csp.sentinel.slots.block.flow.FlowException; public void testMethod() { Entry entry = null; try { entry = SphU.entry("testMethod"); // 业务逻辑处理 } catch (FlowException e) { // 处理限流后的逻辑 System.out.println("被限流了!"); } finally { if (entry != null) { entry.exit(); } } } ``` 4. **启用熔断降级** 借助 Sentinel 提供的注解 `@SentinelResource`,可以轻松实现方法级别的熔断降级: ```java import com.alibaba.csp.sentinel.annotation.SentinelResource; import com.alibaba.csp.sentinel.slots.block.BlockException; @SentinelResource(value = "exampleMethod", blockHandler = "handleBlock") public String exampleMethod() { return "Success"; } public String handleBlock(BlockException ex) { return "Blocked by Sentinel!"; } ``` 5. **接入网关限流** 如果需要在网关层面对请求进行限流,则可以通过 Spring Cloud Gateway 和 Sentinel 的结合来实现。只需在网关模块中引入相关依赖并配置规则即可。 #### 总结 阿里 Sentinel 以其强大的功能和灵活的配置方式,成为了 Spring Cloud 第二代熔断器的理想选择。它不仅提供了全面的保护手段,还拥有便捷的操作体验,非常适合现代微服务架构下的高并发场景需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值