存叭 发表于 2025-12-28 00:50:02

Spring Boot整合Sentinel之流量控制入门

目录

[*]Sentinel简介
[*]Sentinel 入门 demo
[*]限流入门示例|done
[*]结束语
[*]Reference

摘要 介绍Spring Boot 4 如何整合流量治理神器Sentinel,入门案例以实现流量控制为切入点。
Sentinel简介

  什么是Sentinel?随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由/调度、流量控制、流量整形、熔断降级、系统自适应过载保护/实例摘除、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。
Sentinel 具有以下特征:
  ♥丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
  ♥完备的实时监控:可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模集群的汇总运行情况。
  ♥广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多种语言的原生实现。
  ♥完善的 SPI 扩展机制:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
  流量控制(flow control)原理是监控应用流量的 QPS 或并发线程数等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。限流的直接表现是在执行 Entry nodeA = SphU.entry(resourceName) 的时候抛出 FlowException 异常。FlowException 是 BlockException 的子类,您可以捕捉 BlockException 来自定义被限流之后的处理逻辑。
  『资源』是 Sentinel 的关键概念,只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。
  『规则』围绕资源的实时状态设定的规则,可以包括「流量控制规则」、「熔断降级规则」以及「系统保护规则」。对于同一个资源,我们通过规则定义如何程序保护资源,所有规则可以动态实时调整。
  Sentinel 的「设计理念」是让编码人员自由选择控制的角度,并进行灵活组合,从而达到想要的效果。它的流量控制规则由下表的关键属性组成:
字段名说明默认值resource资源名count限流阈值grade限流机制,1 QPS,0 并发线程数QPS 模式limitApp流控针对的调用来源default,代表不区分调用来源strategy调用关系限流,包括资源自身、其它关联资源 (refResource)和链路入口等根据资源本身controlBehavior流量控制效果(直接拒绝、预热和匀速排队等)直接拒绝  限流的直接表现是在执行Entry nodeA = SphU.entry(resourceName)的时候抛出FlowException异常。FlowException是BlockException的子类,您可以捕捉BlockException来自定义被限流之后的处理逻辑。
  本文以《一步步搭建JDK 21 Spring Boot项目》搭建的Spring Boot项目为基础,演示Sentinel 限流功能。
Sentinel 入门 demo

  使用 Sentinel 来进行资源保护,主要分为几个步骤:

[*]定义资源
[*]设置规则
[*]验证规则
  定义需要保护的资源后配置限流规则。我们可以理解为只要有了资源,就可以在任何时候灵活地定义各种流量控制规则。在编码之前考虑此代码片段是否需要保护,如果需要保护,就将其定义为一个资源。今天咱们就把Sentinel限流掰开揉碎讲清楚怎么对流量洪峰限流保证服务稳定性。

[*]引入 Sentinel 依赖
  如果您的应用使用了 Maven,则从maven仓库地址中找适合的sentinel版本并加入 pom.xml 文件中。我使用的是 JDK 21 + Spring Boot 4.0.0,故引入以下Sentinel依赖包:
<dependency>
    <groupId>com.alibaba.csp</groupId>
    sentinel-core</artifactId>
    <version>1.8.9</version>
</dependency>限流入门示例|done

  定义资源。我们一般会将 Java 中的方法定义为资源,也可以更灵活地对资源进行定义。在下面的例子中,我们定义的资源名是【my_resource】,将System.out.println("Hello Sentinel");这个代码片段作为被保护的资源,把它用Sentinel API SphU.entry("my_resource")和entry.exit()包裹起来。见如下代码中的函数sentinelDemo(String resourceName):
import com.alibaba.csp.sentinel.Entry;import com.alibaba.csp.sentinel.SphU;import com.alibaba.csp.sentinel.slots.block.BlockException;import com.cactus.wiener.config.FlowRules;/** * @Author 楼兰胡杨 * @Description: 简单的限流示例 */public class SimpleSentinelDemo {    public static void main(String[] args) {      // 定义资源名称      String resourceName = "my_resource";      //加载流控规则      FlowRules.initFlowRules(resourceName);      // 启动测试示例      sentinelDemo(resourceName);    }    public static void sentinelDemo(String resourceName) {      Entry entry1 = null;      for (int i = 1; i

驳嗦 发表于 2026-1-4 06:41:58

收藏一下   不知道什么时候能用到

轩辕琳芳 发表于 2026-1-13 18:36:13

很好很强大我过来先占个楼 待编辑

予捻 发表于 2026-1-13 19:12:53

感谢分享

费卿月 发表于 2026-1-14 07:51:11

很好很强大我过来先占个楼 待编辑

睁扼妤 发表于 2026-1-14 11:50:00

懂技术并乐意极积无私分享的人越来越少。珍惜

钿稳铆 发表于 2026-1-15 01:10:28

收藏一下   不知道什么时候能用到

注思 发表于 2026-1-17 13:40:23

东西不错很实用谢谢分享

高小雨 发表于 2026-1-18 05:20:17

懂技术并乐意极积无私分享的人越来越少。珍惜

柩通奉 发表于 2026-1-20 08:05:10

谢谢楼主提供!

煞赶峙 发表于 2026-1-22 11:51:18

谢谢楼主提供!

崔瑜然 发表于 2026-1-26 09:24:13

谢谢分享,辛苦了

飧沾 发表于 2026-2-1 02:31:05

这个有用。

稞冀 发表于 2026-2-3 10:12:31

收藏一下   不知道什么时候能用到

喳谍 发表于 2026-2-3 23:33:53

热心回复!

客臂渐 发表于 2026-2-4 06:40:39

感谢,下载保存了

啪炽 发表于 2026-2-10 07:36:27

感谢发布原创作品,程序园因你更精彩

龙梨丝 发表于 2026-2-10 21:22:05

新版吗?好像是停更了吧。

万俟谷雪 发表于 2026-2-11 12:16:48

喜欢鼓捣这些软件,现在用得少,谢谢分享!

崆蛾寺 发表于 2026-2-11 23:52:37

谢谢楼主提供!
页: [1] 2
查看完整版本: Spring Boot整合Sentinel之流量控制入门