Sentinel 使用案例详细教程

news2024/9/20 12:33:30

文章目录

    • 一、Sentinel 使用
      • 1.1 Sentinel 客户端
      • 1.2 Sentinel 控制台
      • 1.3 客户端和控制台的通信所需依赖
    • 二、测试 Sentinel 限流规则
      • 2.1 启动配置
      • 2.2 定义限流资源
      • 2.3 配置流量控制规则
      • 2.4 运行项目
    • 三、 测试 Sentinel 熔断降级规则
      • 3.1 定义资源
      • 3.2 配置熔断降级规则
      • 3.3 运行项目
    • 四、测试 fallback 函数
      • 4.1 定义资源
      • 4.2 运行项目
    • 参考资料

完整案例代码:java-demos/spring-cloud-sentinel at main · idealzouhu/java-demos (github.com)

一、Sentinel 使用

Sentinel 分为两个部分:

  • **核心库(Java 客户端)**不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持。
  • **控制台(Dashboard)**基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器。

1.1 Sentinel 客户端

Sentinel客户端对应的依赖为 sentinel-core。

<!-- sentinel核心库依赖 -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-core</artifactId>
    <version>1.8.6</version>
</dependency>

同时,Sentinel 还针对不同的开源框架做适配,比较常用的有 spring-cloud-starter-alibaba-sentinel

1.2 Sentinel 控制台

Sentinel 控制台支持实时监控和规则管理, 可以在本地或者公网部署。

从 release 页面 下载最新版本的控制台 jar 包,使用如下命令启动控制台:

java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.8.jar

其中,各部分参数的含义如下:

  • -Dserver.port=8080:指定 Sentinel 控制台端口为 8080
  • -Dcsp.sentinel.dashboard.server=localhost:8080:指定 Sentinel 客户端连接的 Dashboard 服务地址。也就是说 Sentinel 客户端会连接到本地 8080 端口上的 Sentinel Dashboard 进行监控。

在启动控制台后,可以通过 http://localhost:8080 来访问控制台, 默认用户名和密码都是 sentinel

在这里插入图片描述

1.3 客户端和控制台的通信所需依赖

客户端需要引入 Transport 模块来与 Sentinel 控制台进行通信。

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
</dependency>

同时,还要在 application.yaml 中进行相应的配置:

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080   # 指定 Sentinel Dashboard 地址
        port: 8719                  # 客户端监控端口,用于与 Sentinel Dashboard 通信

二、测试 Sentinel 限流规则

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

  1. 定义资源
  2. 定义规则
  3. 检验规则是否生效

2.1 启动配置

对 Sentinel 客户端进行相应的配置

spring:
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080   # 指定 Sentinel Dashboard 地址
        port: 8719                  # 客户端监控端口,用于与 Sentinel Dashboard 通信
      eager: true
      filter:
        enabled: true

不同配置的含义如下:

  • spring.cloud.sentinel.transport.port 端口配置会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互。比如 Sentinel 控制台添加了一个限流规则,会把规则数据 push 给这个 Http Server 接收,Http Server 再将规则注册到 Sentinel 中。

2.2 定义限流资源

创建 com.zouhu.spring.cloud.sentinel.controller.SentinelController 类,具体代码如下:

RestController
public class SentinelController {

    /**
     * 测试限流规则的使用
     *  <p>
     *      定义资源  "SentinelController#testFlowRule"。
     *      限流规则  {@link com.zouhu.spring.cloud.sentinel.config.FlowRuleInit}。
     *      方法调用链接: http://localhost:9000/flow/10。
     *  </p>
     *
     *
     * @return
     */
    @GetMapping("/flow/{id}")
    @SentinelResource(value = "SentinelController#testFlowRule", blockHandler = "handleBlock")
    public String testFlowRule(@PathVariable("id") int id) {
        System.out.println("test" + id);
        return "Request success!" + id;
    }
    
     /**
     * blockHandler 函数
     * <p>
     *     在资源请求被限流/降级/系统保护的时候调用, 相当于替换原方法。
     *     处理 BlockException。
     * </p>
     * @param ex
     * @return
     */
    public String handleBlock(int id, BlockException ex) {
        return "Request blocked!";
    }

}
    

@SentinelResource 注解:为 test 接口定义了一个受保护的资源。如果该接口的流量超过设定的阈值,则会触发限流,进而调用 handleBlock 方法。

blockHandler:当流量控制或熔断降级触发时,会调用该方法,返回对应的提示信息。

2.3 配置流量控制规则

除了通过注解定义限流规则,你还可以使用 Sentinel 控制台(Dashboard)动态配置规则,或者在代码中编写限流规则。流量规则代码如下:

@Component
public class FlowRuleInit implements CommandLineRunner {
    @Override
    public void run(String... args) {
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule1 = new FlowRule();
        rule1.setResource("SentinelController#testFlowRule");
        rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
        rule1.setCount(2); // QPS 限制为 2
        rules.add(rule1);
        FlowRuleManager.loadRules(rules);
    }
}

2.4 运行项目

我们可以在是否使用 blockHandler 这两种情况下测试限流规则。

(1) 不使用 blockHandler

使用 Postman 批量测试 http://localhost:9000/flow/{{id}},Sentinel 会触发流控,状态码为 500 internal server error。否则返回正常结果 Request success!

在这里插入图片描述

同时,Sentinel 会抛出异常 FlowException。相关日志如下:

2024-09-10T17:21:19.962+08:00 ERROR 19288 --- [nio-8080-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.reflect.UndeclaredThrowableException] with root cause

com.alibaba.csp.sentinel.slots.block.flow.FlowException: null

(2)使用 blockHandler

使用 Postman 批量测试 http://localhost:9000/flow/{{id}},Sentinel 会触发流控,状态码为 200 OK, 返回 Request blocked!。否则返回正常结果 Request success!

在这里插入图片描述

三、 测试 Sentinel 熔断降级规则

3.1 定义资源

@RestController
public class SentinelController {
	/**
     * 测试熔断降级规则的使用(存在问题)
     * <p>
     *      定义资源  "SentinelController#testFlowRule"。
     *      限流规则  {@link com.zouhu.spring.cloud.sentinel.config.FlowRuleInit}。
     *      方法调用链接: http://localhost:8080/degrade/10。
     * </p>
     *
     * @param id
     * @return
     */
    @GetMapping("/degrade/{id}")
    @SentinelResource(value = "SentinelController#testDegradeRule", blockHandler = "handleBlock")
    public String testDegradeRule(@PathVariable("id") int id) throws FlowException {
        // 模拟可能抛出的异常
        // 注意:熔断降级规则针对的异常只是 BlockException 以及其子类,不针对其他异常
        if (new Random().nextInt(10) < 8) {
            throw new FlowException("Simulated FlowException");
        }
        return "Request success!" + id;
    }

    /**
     * blockHandler 函数
     * <p>
     *     在资源请求被限流/降级/系统保护的时候调用, 相当于替换原方法。
     *     处理 BlockException。
     * </p>
     * @param ex
     * @return
     */
    public String handleBlock(int id, BlockException ex) {
        return "Request blocked!";
    }

}

3.2 配置熔断降级规则

public class DegradeRuleInit  implements CommandLineRunner {

    /**
     * 根据异常比例熔断
     * <p>
     *     当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,
     *     并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断
     * </p>
     *
     * @param args
     */
    @Override
    public void run(String... args) {
        List<DegradeRule> rules = new ArrayList<>();
        DegradeRule rule1 = new DegradeRule("SentinelController#testDegradeRule")
                .setGrade(CircuitBreakerStrategy.ERROR_RATIO.getType())
                .setCount(0.5) // 阈值为 50% 错误率
                .setMinRequestAmount(20)
                .setStatIntervalMs(1000) // 统计时长 1 秒
                .setTimeWindow(10); // 熔断持续时间 10 秒
        rules.add(rule1);
        DegradeRuleManager.loadRules(rules);

    }
}

3.3 运行项目

使用 Postman 批量测试 http://localhost:9000/degrade/{{id}},Sentinel 会触发熔断降级,返回 Request blocked!。否则返回正常结果 Request success!
在这里插入图片描述

四、测试 fallback 函数

4.1 定义资源

@RestController
public class SentinelController {
 	/**
     * 测试 fallback 规则的使用
     * <p>
     *     定义资源  "SentinelController#testFlowRule"。
     *     方法调用链接: http://localhost:8080/degrade/10。
     * </p>
     *
     * @return
     */
    @GetMapping("/testFallback")
    @SentinelResource(value = "SentinelController#testFallback", fallback = "handleFallback")
    public String testFallback() {
        // 可能抛出运行时异常的业务逻辑
        if (new Random().nextInt(10) < 5) {
            throw new RuntimeException("Simulated error");
        }
        return "Request success!";
    }

    /**
     * fallback 函数
     * <p>
     *       当业务异常或降级规则触发时调用此方法
     * </p>
     *
     * @param ex
     * @return
     */
    public String handleFallback(Throwable ex) {
        return "Fallback due to exception: " + ex.getMessage();
    }

	
}

4.2 运行项目

多次运行 http://localhost:9000/testFallback

当出现异常的时候,结果如下:
在这里插入图片描述

参考资料

Spring Cloud Alibaba Sentine 官方使用案例

basic-api-resource-rule | Sentinel (sentinelguard.io)

介绍 · alibaba/Sentinel Wiki (github.com)

sentinel-guides/sentinel-guide-spring-cloud at master · sentinel-group/sentinel-guides (github.com)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Postman]接口自动化测试入门

文章大多用作个人学习分享&#xff0c;如果大家觉得有不足或错漏的地方欢迎评论指出或补充 此文章将完整的走一遍一个web页面的接口测试流程 大致路径为&#xff1a; 创建集合->调用接口登录获取token->保存token->带着token去完成其他接口的自动化测试->断言-&g…

信息架构的战略视角:驱动数字化转型的设计原则与实践创新

在数字经济快速发展的今天&#xff0c;企业的成功越来越依赖于其信息架构的稳健性和灵活性 数字化转型不仅要求技术创新&#xff0c;更需要架构设计上的深思熟虑。《信息架构&#xff1a;商业智能&分析与元数据管理参考模型》作为信息架构领域的权威指南&#xff0c;为企业…

走心式精密数控车床

当然&#xff0c;让我来为您深入解析一下“走心式精密数控车床”这一话题。一、定义与概述 走心式精密数控车床&#xff0c;也被称为走心式数控车床或走心机&#xff0c;是一种高精度、高效率的金属加工设备。它以其独特的走心式加工方式和精密的数控技术&#xff0c;在精密机械…

基于JAVA+SpringBoot+Vue的中药实验管理系统

基于JAVASpringBootVue的中药实验管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末附源码下载链接&#x1f345; 哈…

【2024】Math-Shepherd:无需人工注释即可逐步验证和强化法学硕士。

搜索词&#xff1a; Math-shepherd: Verify and reinforce llms step-by-step without human annotations P Wang, L Li, Z Shao, R Xu, D Dai, Y Li, D Chen, Y Wu, Z Sui Proceedings of the 62nd Annual Meeting of the Association for …, 2024•aclanthology.org 摘要…

Vue3.0项目实战(四)——大事件管理系统个人中心实现

目录 1. ChatGPT & Copilot 1.1 工具 Github Copilot 智能生成代码的使用 2. 个人中心项目实战 - 基本资料 2.1 静态结构 2.2 校验处理 2.3 封装接口&#xff0c;更新个人信息 3. 个人中心项目实战 - 更换头像 3.1 静态结构 3.2 选择预览图片 3.3 上传头像 4. 个…

国产化数据库挑战及发展趋势

非国产数据库如Oracle、MySQL和MSSQL等在某些领域占据重要地位&#xff0c;但国产数据库的市场份额正在逐步提升&#xff0c;特别是在政策支持和市场需求的双重推动下&#xff0c;国产数据库的替代进程正在加速。 一、国产数据库市场规模 2024年中国数据库市场规模预计为543.1亿…

Excel数据清洗工具:提高数据处理效率的利器

Excel数据清洗工具&#xff1a;提高数据处理效率的利器 引言 在当今的数据驱动时代&#xff0c;数据的质量直接影响着分析结果的可靠性和有效性。然而&#xff0c;在实际工作中&#xff0c;我们常常会遇到数据中的各种问题&#xff0c;如重复记录、缺失值、格式不一致等。为了…

NISP 一级 | 3.3 网络安全防护与实践

关注这个证书的其他相关笔记&#xff1a;NISP 一级 —— 考证笔记合集-CSDN博客 0x01&#xff1a;虚拟专用网络 VPN 概述 虚拟专用网络&#xff08;Virtual Private Network&#xff0c;VPN&#xff09;是在公用网络上建立专用网络的技术。整个 VPN 网络的任意两个节点之间的连…

Python | Leetcode Python题解之第397题整数替换

题目&#xff1a; 题解&#xff1a; class Solution:def integerReplacement(self, n: int) -> int:ans 0while n ! 1:if n % 2 0:ans 1n // 2elif n % 4 1:ans 2n // 2else:if n 3:ans 2n 1else:ans 2n n // 2 1return ans

游戏领域的AI革命:从静态世界到动态玩家体验

在当今的数字化时代,游戏已经成为连接虚拟与现实世界的桥梁。开放世界游戏以其无与伦比的自由度和沉浸感吸引了无数玩家,但同时也面临着对话重复、行为可预测和互动有限等问题。本文将探讨AI技术如何通过程序化生成、动态NPC、实时行为生成以及声音与音乐等方面的应用,为游戏…

Android 知识简记 快速回顾各种知识

2.Java 基础&容器&同步&设计模式 3.Java 虚拟机&内存结构&GC&类加载&四种引用&动态代理 4.Android 基础&性能优化&Framwork 5.Android 模块化&热修复&热更新&打包&混淆&压缩 6.音视频&FFmpeg&播放器 …

创游系列开心娱乐完整组件

别人分享的一套东西&#xff0c;是个不错的娱乐源码&#xff0c;里面包含了很多小游戏。可以创建房间。 没测试自行研究吧&#xff0c;内含搭建教程。 代码免费下载&#xff1a;百度网盘

Java | Leetcode Java题解之第397题整数替换

题目&#xff1a; 题解&#xff1a; class Solution {public int integerReplacement(int n) {int ans 0;while (n ! 1) {if (n % 2 0) {ans;n / 2;} else if (n % 4 1) {ans 2;n / 2;} else {if (n 3) {ans 2;n 1;} else {ans 2;n n / 2 1;}}}return ans;} }

3D Gaussian Splatting 论文学习

概述 目前比较常见的渲染方法大致可以分为2种&#xff1a; 将场景中的物体投影到渲染平面&#xff1a;传统的渲染管线就是这种方式&#xff0c;主要针对Mesh数据&#xff0c;可以将顶点直接投影成2D的形式&#xff0c;配合光栅化、深度测试、Alpha混合等就可以得到渲染的图像…

【Java基础】——深入理解Java异常

目录 1- 什么是异常概述&#xff08;What、Why&#xff09;1-1 什么是异常(What)1-2 为什么要有异常处理机制(Why) 2- ⭐异常体系结构图-总览2-1 分类2-2 异常体系结构小结 3- 五大运行时异常3-1 NullPointerException 空指针异常3-2 ArithmeticException 算数异常3-3 ArrayInd…

HPL 源码结构分析

文件夹结构&#xff1a; $ cd /home/hipper/ex_hpl_hpcg/ $ pwd $ mkdir ./openmpi $mkdir ./openblas $mkdir ./hpl $ tree 1. 安装openmpi 1.1.1 使用Makefile下载配置编译安装 openmpi Makefile&#xff1a; all:wget https://download.open-mpi.org/release/open-m…

java spring定时任务-动态任务

cron表达式 在线生成https://cron.qqe2.com/ 6个时间刻度的话 * * * * * * 分别对应 秒 分 时 日 月 星期 &#xff1b; 7个时间刻度的话 * * * * * * * 分别对应 秒 分 时 日 月 星期 年&#xff1b;每隔5秒执行一次&#xff1a;*/5 * * * * ? 每隔1分钟执行一次&#xff1a…

AI如何辅助未来数学研究:陶哲轩的最新见解与应用展望

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;AI在多个领域的应用已经渗透到了我们生活的方方面面。然而&#xff0c;在严谨且逻辑性极强的数学研究领域&#xff0c;AI能否真正发挥作用&#xff1f;2024年&#xff0c;著名数学家、菲尔兹奖得主陶哲轩在IM…

【Nacos】配置中心

Nacos除了注册中心和负载均衡之外&#xff0c;还是一个配置中心&#xff0c;具备配置管理的功能。 Nacos 配置中心是一种用于集中式管理应用程序配置的服务&#xff0c;它可以将应用程序的配置从代码和本地配置文件中分离出来&#xff0c;实现配置的集中管理和动态更新。通过 …