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.propertiesapplication.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 控制台,你可以可视化地配置和管理规则,实时生效,无需重启应用。

  1. 访问 Sentinel 控制台: 访问你在 application.properties 中配置的 spring.cloud.sentinel.transport.dashboard 地址(默认 http://localhost:8080)。
  2. 找到你的应用: 在控制台的 “簇点链路” 或 “机器列表” 中找到你的 Spring Boot 应用。
  3. 配置规则: 在 “流控规则”、“降级规则”、“热点规则” 等菜单中,为你的资源配置相应的规则。 例如,为 “myResource” 配置一个 QPS 为 2 的流控规则。
  4. 按如下操作
    在这里插入图片描述
    添加“流控”规则
    在这里插入图片描述
    添加“熔断”机制
    在这里插入图片描述

方式二:在代码中编程式配置规则

你也可以在代码中编程式地配置规则,这种方式更适合自动化配置或单元测试。

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 {

    @Override
    public 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); // 流控类型:QPS
        rule.setCount(2); // QPS 阈值为 2
        rules.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 应用

  1. 启动 Sentinel 控制台: 下载 Sentinel 控制台的 JAR 包,并使用 java -jar sentinel-dashboard.jar 命令启动。 默认访问地址为 http://localhost:8080,默认用户名密码都是 sentinel
  2. 启动 Spring Boot 应用: 启动你的 Spring Boot 应用。

步骤 6: 测试和监控

  1. 访问受保护的接口: 访问你应用中被 @SentinelResource 或编程式 API 保护的接口。
  2. 观察 Sentinel 控制台: 在 Sentinel 控制台中,你可以看到你的应用的监控数据,例如 “簇点链路” 中会显示资源的请求量、通过量、拒绝量、平均响应时间等指标。
  3. 测试流控效果: 尝试以超过你配置的流控阈值的速率访问受保护的接口,你会看到部分请求被 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 提供的可视化控制台和丰富的特性,也使得流量控制和容错管理更加便捷高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/969645.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

IoTDB 导入数据时提示内存不足如何处理

问题现象 IoTDB 导入数据时提示内存不足&#xff0c;该如何处理&#xff1f; 解决方案 数据导入脚本会在触发内存不足的时候主动进行重试。当遇到此问题时&#xff0c;用户不用做任何操作&#xff0c;脚本也可以正确进行处理。如果想从根源减少此类提示&#xff0c;可以按照下…

计算机视觉中图像的基础认知

一、图像/视频的基本属性 在计算机视觉中&#xff0c;图像和视频的本质是多维数值矩阵。图像或视频数据的一些基本属性。 宽度&#xff08;W&#xff09; 和 高度&#xff08;H&#xff09; 定义了图像的像素分辨率&#xff0c;单位通常是像素。例如&#xff0c;一张 1920x10…

【React】组件通信

组件通信 父传子 - props function Article(props) {return (<div><h2>{props.title}</h2><p>{props.content}</p><p>状态&#xff1a; {props.active ? 显示 : 隐藏}</p></div>) } // 设置默认值方式一 // 使用 defaultPr…

Tomcat添加到Windows系统服务中,服务名称带空格

要将Tomcat添加到Windows系统服务中&#xff0c;可以通过Tomcat安装目录中“\bin\service.bat”来完成&#xff0c;如果目录中没有service.bat&#xff0c;则需要使用其它方法。 打到CMD命令行窗口&#xff0c;通过cd命令跳转到Tomcat安装目录的“\bin\”目录&#xff0c;然后执…

基于Python深度学习的【蘑菇识别】系统~卷积神经网络+TensorFlow+图像识别+人工智能

一、介绍 蘑菇识别系统&#xff0c;本系统使用Python作为主要开发语言&#xff0c;基于TensorFlow搭建卷积神经网络算法&#xff0c;并收集了9种常见的蘑菇种类数据集【“香菇&#xff08;Agaricus&#xff09;”, “毒鹅膏菌&#xff08;Amanita&#xff09;”, “牛肝菌&…

124 巨坑uni-app踩坑事件 uniCloud本地调试服务启动失败

1.事情是这样的 事情是这样的&#xff0c;我上午在运行项目的时候还是好好的&#xff0c;我什么都没干&#xff0c;没动代码&#xff0c;没更新&#xff0c;就啥也没干&#xff0c;代码我也还原成好好的之前的样子&#xff0c;就报这个错&#xff0c;但是我之前没用过这个服务呀…

Android Studio “Sync project with Gradle Files”按钮消失——文件层级打开不对

问题出现的背景 Android Studio显示&#xff0c;后来查找解决方案&#xff0c;里面提到“Sync project with Gradle Files”按钮&#xff0c;一检查发现自己的软件上面没有这个选项&#xff0c;于是参考 https://debugah.com/android-studio-can-not-find-sync-project-with-g…

什么是HTTP Error 429以及如何修复

为了有效管理服务器资源并确保所有用户都可以访问&#xff0c;主机提供商一般都会对主机的请求发送速度上做限制&#xff0c;一旦用户在规定时间内向服务器发送的请求超过了允许的限额&#xff0c;就可能会出现429错误。 例如&#xff0c;一个API允许每个用户每小时发送100个请…

LAWS是典型的人机环境系统

致命性自主武器系统&#xff08;Lethal Autonomous Weapons Systems&#xff0c;LAWS&#xff09;是一种典型的人机环境系统&#xff0c;它通过高度集成的传感器、算法和武器平台&#xff0c;在复杂的战场环境中自主执行任务。LAWS能够自主感知环境、识别目标、做出决策并实施攻…

IC-Portrait:打造逼真个性化肖像的新纪元!

在数字内容创作、虚拟形象、游戏和增强现实等领域&#xff0c;肖像生成已成为计算机图形学研究的热点。尽管近年来肖像生成模型取得了显著进展&#xff0c;能够生成越来越逼真和吸引人的肖像&#xff0c;但仍面临诸多挑战。 今天&#xff0c;给大家介绍一种个性化肖像生成框架I…

ubuntu服务器部署

关闭欢迎消息 服务器安装好 ubuntu 系统后&#xff0c;进行终端登录&#xff0c;会显示出很多的欢迎消息 通过在用户的根目录下执行 touch .hushlogin 命令&#xff0c;再次登录终端就不会出现欢迎消息 修改hostname显示 修改 /etc/hostname 文件内容为主机名&#xff0c;保…

【第3章:卷积神经网络(CNN)——3.5 CIFAR-10图像分类】

嘿,小伙伴们,今天咱们来聊聊一个超级酷炫的话题——卷积神经网络(CNN)及其在CIFAR-10图像分类中的应用。这不仅仅是一个技术话题,更是一场探索人工智能奥秘的旅程。准备好了吗?咱们这就发车! 一、CNN:人工智能的“千里眼” 首先,咱们得知道CNN是啥。CNN,全名Convol…

腿足机器人之二- 运动控制概览

腿足机器人之二运动控制概览 高层运动规划MPCRL 中层逆运动学和逆动力学底层执行器控制传感器校正 上一篇博客是腿足机器人的骨架和关节的机械和电气组件&#xff0c;关节不仅需要通过机械设计实现复杂的运动能力&#xff0c;还必须通过电子组件和控制系统来精确控制这些运动。…

无人机信号调制技术原理

一、调制技术的必要性 频谱搬移&#xff1a;将低频的基带信号搬移到高频的载波上&#xff0c;便于天线辐射和传播。 信道复用&#xff1a; 利用不同的载波频率或调制方式&#xff0c;实现多路信号同时传输&#xff0c;提高信道利用率。 抗干扰&#xff1a; 通过选择合适的调…

Python 闭包与装饰器

前言&#xff1a;之前讲完了面向对象的三大特征&#xff0c;这篇讲解的是闭包与装饰器&#xff08;作用域&#xff0c;nonlocal关键字&#xff0c;global关键字&#xff09; 闭包 定义 闭包是指有权访问另一个函数作用域中变量的函数。简单来说&#xff0c;即使该函数已经执行…

【Flink快速入门-4.流处理之基于 Key 的算子】

流处理之基于 Key 的算子 实验介绍 在 SQL 中我们经常会用到分组&#xff08;group by&#xff09;操作&#xff0c;在 group 关键词之后指定要聚合的键&#xff0c;在 group 之前指定要聚合的逻辑&#xff08;计数、求和、求最大值等&#xff09;&#xff0c;通过分区键将数…

sib报错:com.*.xctrunner is not in your device!

1、问题描述 在使用sonic集成IOS设备的时候,我们需要通过sonic-agent服务去识别IOS设备。但是在识别的时候提示如下问题: 本质就是在你这个设备中找不到这个设备也就是找不到WebDriverAgentRunner,但是确实安装了,甚至appium可以正常的调用。 或执行如下命令的时候报错:…

数据结构与算法-队列

参考学习&#xff1a;B站-逊哥带你学编程 队列的定义与实现 队列的顺序结构实现 #define MAXSIZE 100 typedef int ElemType;typedef struct {ElemType data[MAXSIZE];int front;int rear; }Queue;图示&#xff1a; 队列的顺序结构-初始化 void initQueue(Queue *Q) {Q->…

SQL联合查询

文章目录 MySQL系列&#xff1a;1.内连接2.外连接3.自连接4.子查询5.合并查询6.插入查询 MySQL系列&#xff1a; 初识MySQL&#xff0c;MySQL常用数据类型和表的操作&#xff0c;增删改查(CRUD)操作(总),数据库约束数据库设计 #班级表 drop table if exists class; create ta…

急停信号的含义

前言&#xff1a; 大家好&#xff0c;我是上位机马工&#xff0c;硕士毕业4年年入40万&#xff0c;目前在一家自动化公司担任软件经理&#xff0c;从事C#上位机软件开发8年以上&#xff01;我们在开发C#的运动控制程序的时候&#xff0c;一个必要的步骤就是确认设备按钮的急停…