Sentinel 使用案例详细教程

文章目录

    • 一、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: truefilter: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 {@Overridepublic 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 限制为 2rules.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 causecom.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*/@Overridepublic 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.rhkb.cn/news/420956.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

info_scan!自动化漏洞扫描系统,附下载链接

在我们团队的日常工作中&#xff0c;定期进行安全演练和漏洞扫描几乎是必不可少的。每次安全互动我们都需要对关键资产进行全面的安全评估&#xff0c;及时发现可能存在的安全隐患。 就在上周&#xff0c;我们针对几个主要服务进行了例行的漏洞扫描。在这个过程中&#xff0c;…

DevOps平台搭建过程详解--Gitlab+Jenkins+Docker+Harbor+K8s集群搭建CICD平台

一、环境说明 1.1CI/CD CI即为持续集成(Continue Integration,简称CI)&#xff0c;用通俗的话讲&#xff0c;就是持续的整合版本库代码编译后制作应用镜像。建立有效的持续集成环境可以减少开发过程中一些不必要的问题、提高代码质量、快速迭代等;(Jenkins) CD即持续交付Con…

合宙低功耗4G模组Air780EX——硬件设计手册01

Air780EX是一款基于移芯EC618平台设计的LTECat1无线通信模组。支持FDD-LTE/TDD-LTE的4G远距离无线 传输技术。另外&#xff0c;模组提供了USB/UART/I2C等通用接口满足IoT行业的各种应用诉求。 一、主要性能 1.1 模块功能框图 1.2 模块型号列表 1.3 模块主要性能 *注: 模组…

Leetcode 最大子数组和

使用“Kadane’s Algorithm”来解决。 Kadane’s Algorithm 在每个步骤中都保持着一个局部最优解&#xff0c;即以当前元素为结尾的最大子数组和(也就是局部最优解)&#xff0c;并通过比较这些局部最优解和当前的全局最优解来找到最终的全局最优解。 Kadane’s Algorithm的核…

巧用工具,Vue 集成 medium-zoom 实现图片缩放

文章目录 巧用工具&#xff0c;Vue 集成 medium-zoom 实现图片缩放介绍medium-zoomVue3集成 medium-zoom 示例Vue2集成 medium-zoom 示例进阶 - 可选参数 巧用工具&#xff0c;Vue 集成 medium-zoom 实现图片缩放 在现代网页开发中&#xff0c;为用户提供良好的视觉体验至关重…

K-Means聚类

聚类的作用&#xff1a; 知识发现 发现事物之间的潜在关系 异常值检测 特征提取 数据压缩的例子 有监督和无监督学习&#xff1a; 有监督&#xff1a; 给定训练集 X 和 标签Y 选择模型 学习&#xff08;目标函数的最优化&#xff09; 生成模型&#xff08;本质上是一组参…

RocketMQ异步报错:No route info of this topic

在SpringBoot中发送RocketMQ异步消息的时候报错了&#xff0c;提示org.apache.rocketmq.client.exception.MQClientException: No route info of this topic, testTopic1 这里给出具体的解决方案 一、Broker模块不支持自动创建topic&#xff0c;并且topic没有被手动创建过 R…

OpenCV 与 YoloV3的结合使用:目标实时跟踪

目录 代码分析 1. YOLO 模型加载 2. 视频加载与初始化 3. 视频帧处理 4. 物体检测 5. 处理检测结果 6. 边界框和类别显示 7. 帧率&#xff08;FPS&#xff09;计算 8. 结果显示与退出 9. 资源释放 整体代码 效果展示 总结 代码分析 这段代码使用 YOLO&#xff08…

Linxu系统:kill命令

1、命令详解&#xff1a; kill命令是用于向进程发送信号&#xff0c;通常用来终止某个指定PID服务进程&#xff0c;kill命令可以发送不同的信号给目标进程&#xff0c;来实现不同的操作&#xff0c;如果不指定信号&#xff0c;默认会发送 TERM 信号&#xff08;15&#xff09;&…

ubuntu 和windows用samba服务器实现数据传输

1&#xff0c;linux安装samba服务器 sudo apt-get install samba samba-common 2&#xff0c;linux 配置权限&#xff0c;修改目录权限&#xff0c;linux下共享的文件权限设置。 sudo chmod 777 /home/lark -R 3. 添加samba用户 sudo smbpasswd -a lark 4&#xff0c;配置共享…

小程序页面整体执行顺序

首先执行 App.onLaunch -> App.onShow其次执行 Component.created -> Component.attached再执行 Page.onLoad -> Page.onShow最后 执行 Component.ready -> Page.onReady 你不知道的小程序系列之生命周期执行顺序

828华为云征文 | Flexus X实例与Harbor私有镜像仓库的完美结合

需要了解 本文章主要讲述在 华为云Flexus X 实例上搭建自己的企业级私有镜像仓库 Harbor&#xff0c;一键部署、搭建高可用安全可靠的容器镜像仓库选择合适的云服务器&#xff1a; 本文采用的是 华为云服务器 Flexus X 实例&#xff08;推荐使用&#xff09;连接方式&#xff1…

ctfshow-PHP特性

web89 <?php include("flag.php"); highlight_file(_FILE_);if(isset($_GET[num])){$num$_GET[num];if(preg_match("/[0-9]/",$num)){die("no no no"); #结束脚本呢执行输出指定信息}if(intval($num)){#把参数转换整数类型echo $flag;} } pr…

用面向对象的方法进行数据分析

项目从两个不同类型的文件&#xff08;文本文件和 JSON 文件&#xff09;读取销售数据&#xff0c;将其封装为 Record 对象&#xff0c;合并数据后&#xff0c;统计每天的销售总额&#xff0c;并通过 pyecharts 库生成一个包含每日销售额的柱状图&#xff08;Bar chart&#xf…

无线感知会议系列【1】【增强无线感知应用的鲁棒性】

前言&#xff1a; 这个是2021年 泛在可信智能感知论坛&#xff0c;汤战勇 &#xff08;西北大学物联网研究院 )教授的 一个讲座《wireless signals like WiFi, RFID and (ultra) sound as a powerful modality for ubiquitous sensing》 参考连接&#xff1a; 4.见微知萌—…

ollama 本地部署

ollama 本地模型部署 下载安装: [link](https://ollama.com/download)下载说明 部署使用在终端查看ollama是否安装完成终端查看ollama 命令说明查看当前支持下载的模型启动对话模式默认情况下&#xff0c;ollama启动了server 的api访问功能 外部 api访问使用postman网页版本for…

什么是Aware注入?

Spring容器可以在Bean初始化的时候&#xff0c;自动注入一些特定信息&#xff08;如beanfactory&#xff09;,使得bean可以轻松的访问其他Bean的实例&#xff0c;简化代码&#xff0c;避免了显式的注入。 Spring提供了很多Aware的接口,如下&#xff1a; 拿其中的BeanFactoryAwa…

全频段覆盖的卫星通信模块-灵活应对多应用场景

LoRa1121是采用SEMTECH的LR1121芯片&#xff0c;这是一款超低功耗、远程LoRa收发器&#xff0c;支持Sub-GHz和全球2.4GHz频谱中的地面ISM频段通信&#xff0c;且支持用于卫星连接的S频段。LoRa1121支持LoRa&#xff0c;(G)FSK调制&#xff0c;Sigfox协议&#xff0c;以及&#…

SRS流媒体服务器从入门到精通(其一,环境搭建)

欢迎诸位来阅读在下的博文~ 在这里&#xff0c;在下会不定期发表一些浅薄的知识和经验&#xff0c;望诸位能与在下多多交流&#xff0c;共同努力! 江山如画&#xff0c;客心如若&#xff0c;欢迎到访&#xff0c;一展风采 文章目录 一、SRS简介二、SRS的应用场景三、环境搭建…

Leetcode - 周赛414

目录 一&#xff0c;3280. 将日期转换为二进制表示 二&#xff0c;3281. 范围内整数的最大得分 三&#xff0c;3282. 到达数组末尾的最大得分 四&#xff0c;3283. 吃掉所有兵需要的最多移动次数 一&#xff0c;3280. 将日期转换为二进制表示 本题就是简单的字符串和整数之…