Springboot 中如何使用Sentinel
在 Spring Boot 中使用 Sentinel 非常方便,Spring Cloud Alibaba 提供了 spring-cloud-starter-alibaba-sentinel 组件,可以快速将 Sentinel 集成到你的 Spring Boot 应用中,并利用其强大的流量控制和容错能力。
下面是一个详细的步骤指南
步骤 1: 添加 Sentinel 依赖
首先,需要在你的 pom.xml 文件中添加 Spring Cloud Alibaba Sentinel 的依赖。确保你已经配置了 Spring Cloud Alibaba 的依赖管理 (spring-cloud-alibaba-dependencies)。
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
如果你需要使用 Sentinel 的持久化功能,例如将规则持久化到 Nacos 配置中心,还需要添加相应的依赖,例如:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
步骤 2: 配置 Sentinel
在 application.properties 或 application.yml 文件中配置 Sentinel 的基本信息。 至少需要配置 Sentinel 控制台的地址,以便你可以通过控制台查看监控数据和管理规则。
spring:application:name: your-spring-boot-app # 应用名称,Sentinel 控制台中会显示cloud:sentinel:transport:dashboard: localhost:8080 # Sentinel 控制台的地址 (默认端口 8080)port: 8719 # Sentinel 客户端与控制台通信的端口,默认 8719,可以自定义,避免冲突# 如果需要持久化规则到 Nacos,还需要配置 Nacos 相关信息
# nacos:
# config:
# server-addr: your-nacos-server-address:8848
注意: 你需要先启动 Sentinel 控制台,才能在控制台中看到你的 Spring Boot 应用的监控数据和配置规则。 你可以从 Sentinel 的 GitHub 仓库下载 Sentinel 控制台的 JAR 包并启动。
步骤 3: 定义受保护的资源
在 Spring Boot 中,你可以使用以下方式来定义需要 Sentinel 保护的资源:
方式一:使用 @SentinelResource 注解
这是最常用的方式,通过在方法上添加 @SentinelResource 注解,可以声明该方法为一个受保护的资源。
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.stereotype.Service;@Service
public class MyService {@SentinelResource(value = "myResource", blockHandler = "handleBlock")public String doSomething() {// 业务逻辑return "Success";}// BlockHandler 方法,用于处理 BlockException,即限流、熔断等 block 情况public String handleBlock(BlockException e) {return "Blocked by Sentinel: " + e.getClass().getSimpleName(); // 返回被 Sentinel 拦截的提示信息}
}
@SentinelResource(value = "myResource"):value属性指定资源的名称,在 Sentinel 控制台中会显示这个名称。blockHandler = "handleBlock":blockHandler属性指定了当资源被限流、熔断等 block 时,应该调用的 blockHandler 方法。handleBlock方法的签名需要和被保护的方法一致,但最后一个参数必须是BlockException类型。blockHandler方法负责处理 block 逻辑,例如返回友好的提示信息或执行降级操作。
方式二:编程式 API 定义资源
除了注解,你也可以使用 Sentinel 提供的编程式 API 来定义资源,这种方式更加灵活,可以更细粒度地控制资源的入口和出口。
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.Tracer;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.stereotype.Service;@Service
public class MyService {public String doSomethingProgrammatically() {Entry entry = null;try {entry = SphU.entry("myProgrammaticResource"); // 定义资源名// 被保护的业务逻辑return "Success from Programmatic Resource";} catch (BlockException e) {// 处理 BlockException,例如限流、熔断等return "Blocked by Sentinel (Programmatic): " + e.getClass().getSimpleName();} catch (Exception ex) {// 业务逻辑异常,需要记录到 Sentinel 的异常统计中Tracer.traceEntry(entry, ex);throw ex;} finally {if (entry != null) {entry.exit(); // 保证 exit() 被调用,否则会导致统计数据不准确}}}
}
SphU.entry("myProgrammaticResource"):SphU.entry()方法用于定义一个资源入口,参数为资源名称。 它会返回一个Entry对象,用于标记资源的入口。entry.exit(): 在finally块中调用entry.exit(),表示资源调用结束。 必须确保entry.exit()被调用,否则会导致 Sentinel 的统计数据不准确。BlockException捕获: 需要捕获BlockException异常,并处理限流、熔断等 block 情况。Tracer.traceEntry(entry, ex): 如果业务逻辑发生异常,需要使用Tracer.traceEntry()方法将异常信息记录到 Sentinel 的异常统计中。
步骤 4: 配置流控规则
定义了受保护的资源后,你需要配置流控规则,告诉 Sentinel 如何对这些资源进行保护。 你可以通过以下方式配置规则:
方式一:在 Sentinel 控制台配置
这是最推荐的方式,通过 Sentinel 控制台,你可以可视化地配置和管理规则,实时生效,无需重启应用。
- 访问 Sentinel 控制台: 访问你在
application.properties中配置的spring.cloud.sentinel.transport.dashboard地址(默认http://localhost:8080)。 - 找到你的应用: 在控制台的 “簇点链路” 或 “机器列表” 中找到你的 Spring Boot 应用。
- 配置规则: 在 “流控规则”、“降级规则”、“热点规则” 等菜单中,为你的资源配置相应的规则。 例如,为 “myResource” 配置一个 QPS 为 2 的流控规则。
- 按如下操作

添加“流控”规则

添加“熔断”机制

方式二:在代码中编程式配置规则
你也可以在代码中编程式地配置规则,这种方式更适合自动化配置或单元测试。
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;import java.util.ArrayList;
import java.util.List;@Component
public class FlowRuleConfig implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {initFlowRules();}private void initFlowRules() {List<FlowRule> rules = new ArrayList<>();FlowRule rule = new FlowRule();rule.setResource("myResource"); // 资源名称,与 @SentinelResource 注解中的 value 对应rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // 流控类型:QPSrule.setCount(2); // QPS 阈值为 2rules.add(rule);FlowRuleManager.loadRules(rules); // 加载规则}
}
FlowRule:FlowRule对象表示一个流控规则。rule.setResource("myResource"): 指定规则应用于哪个资源,需要与@SentinelResource注解或编程式 API 中定义的资源名称一致。rule.setGrade(RuleConstant.FLOW_GRADE_QPS): 设置流控类型为 QPS (每秒请求数)。rule.setCount(2): 设置 QPS 阈值为 2,即每秒钟只允许 2 个请求通过。FlowRuleManager.loadRules(rules): 加载配置好的规则列表。
步骤 5: 启动 Sentinel 控制台和 Spring Boot 应用
- 启动 Sentinel 控制台: 下载 Sentinel 控制台的 JAR 包,并使用
java -jar sentinel-dashboard.jar命令启动。 默认访问地址为http://localhost:8080,默认用户名密码都是sentinel。 - 启动 Spring Boot 应用: 启动你的 Spring Boot 应用。
步骤 6: 测试和监控
- 访问受保护的接口: 访问你应用中被
@SentinelResource或编程式 API 保护的接口。 - 观察 Sentinel 控制台: 在 Sentinel 控制台中,你可以看到你的应用的监控数据,例如 “簇点链路” 中会显示资源的请求量、通过量、拒绝量、平均响应时间等指标。
- 测试流控效果: 尝试以超过你配置的流控阈值的速率访问受保护的接口,你会看到部分请求被 Sentinel 拦截,并返回你在
blockHandler方法中定义的提示信息。
高级特性 (可选)
Sentinel 还提供了很多高级特性,你可以根据实际需求进行探索和使用,例如:
- 降级规则 (Degrade Rule): 配置熔断降级规则,当服务的错误率或响应时间超过阈值时,自动熔断,防止故障扩散。
- 热点参数限流 (Hot-spot Param Flow Control): 根据请求的热点参数进行限流,例如根据用户 ID、商品 ID 等。
- 系统规则 (System Rule): 从系统全局负载角度进行保护,例如根据 CPU 使用率、Load、内存使用率等进行自适应限流。
- 授权规则 (Authority Rule): 进行黑白名单授权控制,限制特定来源的请求访问。
- 持久化规则 (Rule Persistence): 将规则持久化到 Nacos、ZooKeeper、Redis 等配置中心,实现规则的动态更新和集群共享。
- 自定义 BlockHandler 和 Fallback: 更灵活地处理 BlockException 和业务异常,实现更精细的降级策略。
- 集群流控 (Cluster Flow Control): 对集群中的多个实例进行统一的流量控制。
总结
使用 Spring Cloud Alibaba Sentinel 在 Spring Boot 中实现限流、熔断降级是非常简单的。 通过添加依赖、配置 Sentinel 控制台地址、定义受保护的资源、配置规则,你就可以快速为你的 Spring Boot 应用增加一层强大的保护屏障,提升系统的稳定性和容错能力。 Sentinel 提供的可视化控制台和丰富的特性,也使得流量控制和容错管理更加便捷高效。
相关文章:
Springboot 中如何使用Sentinel
在 Spring Boot 中使用 Sentinel 非常方便,Spring Cloud Alibaba 提供了 spring-cloud-starter-alibaba-sentinel 组件,可以快速将 Sentinel 集成到你的 Spring Boot 应用中,并利用其强大的流量控制和容错能力。 下面是一个详细的步骤指南 …...
访问Elasticsearch服务 curl ip 端口可以 浏览器不可以
LINUX学习 在虚拟机上面的linux上面用docker 部署Elasticsearch项目后,在linux系统内部用curl ip 端口地址的形式可以访问到Elasticsearch。可以返回数据。 但是在本机的浏览器中输入ip 端口,会报错,找不到服务。 ping 和 trelnet均不通。 …...
Curser2_解除机器码限制
# Curser1_无限白嫖试用次数 文末有所需工具下载地址 Cursor Device ID Changer 一个用于修改 Cursor 编辑器设备 ID 的跨平台工具集。当遇到设备 ID 锁定问题时,可用于重置设备标识。 功能特性 ✨ 支持 Windows 和 macOS 系统🔄 自动生成符合格式的…...
人工智能与低代码如何重新定义企业数字化转型?
引言:数字化转型的挑战与机遇 在全球化和信息化的浪潮中,数字化转型已经成为企业保持竞争力和创新能力的必经之路。然而,尽管“数字化”听上去是一个充满未来感的词汇,落地的过程却往往充满困难。 首先,传统开发方式…...
arkTS基础
arkTS基础 // 变量声明 let hi: string hello; hi hello,world; // 常量声明 const hi: string hello;// ArkTS是一种静态类型语言,所有数据的类型都必须在编译时确定 // 如果一个变量或常量的声明包含了初始值,那么开发者就不需要显式指定其类型。…...
C++20中的std::atomic_ref
一、std::atomic_ref 我们在学习C11后的原子操作时,都需要提前定义好std::atomic变量,然后才可以在后续的应用程序中进行使用。原子操作的优势在很多场合下优势非常明显,所以这也使得很多开发者越来习惯使用原子变量。 但是,在实…...
四、自然语言处理_08Transformer翻译任务案例
0、前言 在Seq2Seq模型的学习过程中,做过一个文本翻译任务案例,多轮训练后,效果还算能看 Transformer作为NLP领域的扛把子,对于此类任务的处理会更为强大,下面将以基于Transformer模型来重新处理此任务,看…...
spring学习(使用spring加载properties文件信息)(spring自定义标签引入)
目录 一、博客引言。 二、基本配置准备。 (1)初步分析。 (2)初始spring配置文件。 三、spring自定义标签的引入。 (1)基本了解。 (2)引入新的命名空间:xmlns:context。 &…...
bigemap pro如何进行poi兴趣点搜索?
准备工具:BIGEMAP Pro是数据要素设计软件(DED),国产基础软件,大数据编辑、制图、多源数据要素类处理软件打开软件右上角选择分类搜索然后用矩形或者选择行政边界线选择需要查询的范围选中范围以后点击查询然后可以直接加载到地图然后图层右键数据导出矢量…...
Mybatis源码02 - 初始化基本过程(引导层部分)
初始化基本过程(引导层部分) 文章目录 初始化基本过程(引导层部分)一:初始化的方式及引入二:初始化方式-XML配置文件1:MyBatis初始化基本过程2:创建Configuration对象的过程2.1&…...
【Elasticsearch】bucket_sort
Elasticsearch 的bucket_sort聚合是一种管道聚合,用于对父多桶聚合(如terms、date_histogram、histogram等)的桶进行排序。以下是关于bucket_sort的详细说明: 1.基本功能 bucket_sort聚合可以对父聚合返回的桶进行排序ÿ…...
k8s证书过期怎么更新?
在 Kubernetes 集群中,证书过期可能导致集群不可用,尤其是 API Server、Controller Manager、Scheduler 等组件所使用的证书。为了恢复集群的正常运行,您需要更新这些证书。以下是更新 Kubernetes 证书的基本步骤: 1. 检查证书状…...
活动预告 |【Part 1】Microsoft 安全在线技术公开课:通过扩展检测和响应抵御威胁
课程介绍 通过 Microsoft Learn 免费参加 Microsoft 安全在线技术公开课,掌握创造新机遇所需的技能,加快对 Microsoft Cloud 技术的了解。参加我们举办的“通过扩展检测和响应抵御威胁”技术公开课活动,了解如何更好地在 Microsoft 365 Defen…...
AIGC-微头条爆款文案创作智能体完整指令(DeepSeek,豆包,千问,Kimi,GPT)
Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列AIGC(GPT、DeepSeek、豆包、千问、Kimi)👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资…...
C# 比较两个List集合内容是否相同
在 C# 中,要比较两个 List<T> 集合的内容是否相同,可以通过以下几种方法: 一、非自定义类的元素比较 1. 使用 SequenceEqual 方法(顺序和内容都相等) 顺序和内容都相等:使用 SequenceEqual。 usin…...
vue2 多页面pdf预览
使用pdfjs-dist预览pdf,实现预加载,滚动条翻页。pdfjs的版本很重要,换了好多版本,终于有一个能用的 node 20.18.1 "pdfjs-dist": "^2.2.228", vue页面代码如下 <template><div v-loading"loa…...
【python】matplotlib(animation)
文章目录 1、matplotlib.animation1.1、FuncAnimation1.2、修改 matplotlib 背景 2、matplotlib imageio2.1、折线图2.2、条形图2.3、散点图 3、参考 1、matplotlib.animation 1.1、FuncAnimation matplotlib.animation.FuncAnimation 是 Matplotlib 库中用于创建动画的一个…...
Hello Robot 推出Stretch 3移动操作机器人,赋能研究与商业应用
Hello Robot公司近日发布了其新一代开源移动操作机器人Stretch 3,这是一款高度灵活的机器人平台,专为机器人研究、教育实验和商业自动化设计。Stretch 3 结合了先进的移动机器人技术、灵巧操作能力和开源软件生态系统,为用户提供了一个功能强…...
从零到一:我的元宵灯谜小程序诞生记
缘起:一碗汤圆引发的灵感 去年元宵节,我正捧着热腾腾的汤圆刷朋友圈,满屏都是"转发锦鲤求灯谜答案"的动态。看着大家对着手机手忙脚乱地切换浏览器查答案,我突然拍案而起:为什么不做一个能即时猜灯谜的微信…...
Docker 安装与配置 Nginx
摘要 1、本文全面介绍了如何在 Docker 环境中安装和配置 Nginx 容器。 2、文中详细解释了如何设置 HTTPS 安全连接及配置 Nginx 以实现前后端分离的代理服务。 2、同时,探讨了通过 IP 和域名两种方式访问 Nginx 服务的具体配置方法 3、此外,文章还涵…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
【Vue】scoped+组件通信+props校验
【scoped作用及原理】 【作用】 默认写在组件中style的样式会全局生效, 因此很容易造成多个组件之间的样式冲突问题 故而可以给组件加上scoped 属性, 令样式只作用于当前组件的标签 作用:防止不同vue组件样式污染 【原理】 给组件加上scoped 属性后…...
