【Spring Cloud Alibaba Sentinel 实现熔断与限流】 —— 每天一点小知识

news/2024/7/7 22:11:13

在这里插入图片描述

                                                                              💧 S p r i n g C l o u d A l i b a b a S e n t i n e l 实现熔断与限流 \color{#FF1493}{Spring Cloud Alibaba Sentinel 实现熔断与限流} SpringCloudAlibabaSentinel实现熔断与限流💧          


🌷 仰望天空,妳我亦是行人.✨
🦄 个人主页——微风撞见云的博客🎐
🐳 《数据结构与算法》专栏的文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
💧 《Java学习笔记》专栏的文章是本人在Java学习中总结的一些知识点~ 💐
🥣 《每天一点小知识》专栏的文章可以丰富你的知识库,滴水成河~ 🌊
🪁 希望本文能够给读者带来一定的帮助~🌸文章粗浅,敬请批评指正!🐥


文章目录

  • 🐳Spring Cloud Alibaba Sentinel 实现熔断与限流
    • 1. Sentinel概念
    • 2. 安装Sentinel控制台
      • 2.1 下载Sentinel控制台
      • 2.2 编译与运行
      • 2.3 访问控制台
    • 3. 初始化演示工程
      • 3.1 创建工程
      • 3.2 添加依赖
      • 3.3 配置文件
      • 3.4 创建示例接口
      • 3.5 启动工程
    • 4. 流控规则
      • 4.1 创建流控规则
      • 4.2 验证流控规则
    • 5. 服务降级
      • 5.1 创建降级规则
      • 5.2 验证降级规则
    • 6. 热点key限流
      • 6.1 创建热点key规则
      • 6.2 验证热点key规则
    • 7. 系统规则
      • 7.1 创建系统规则
      • 7.2 验证系统规则
    • 8. @SentinelResource
      • 8.1 定义自定义逻辑
      • 8.2 验证自定义逻辑
    • 9. 服务熔断功能规则持久化
      • 9.1 创建数据库表
      • 9.2 配置数据源
      • 9.3 配置规则持久化
      • 9.4 重启Sentinel控制台
  • 🐳结语


🐳Spring Cloud Alibaba Sentinel 实现熔断与限流

1. Sentinel概念

Sentinel是一款开源的流量控制组件,它提供了熔断、限流、降级等功能,可以保护微服务架构中的系统免受高并发请求的影响。在本篇博客中,我们将介绍如何使用Spring Cloud Alibaba Sentinel来实现熔断与限流。

在这里插入图片描述

2. 安装Sentinel控制台

Sentinel控制台是一个用于配置和管理Sentinel规则的可视化工具。在开始之前,我们需要先安装Sentinel控制台。

2.1 下载Sentinel控制台

💧在你的开发环境中选择一个合适的目录,执行以下命令下载Sentinel控制台:

git clone https://github.com/alibaba/Sentinel.git
cd Sentinel

2.2 编译与运行

💧进入Sentinel控制台目录,执行以下命令进行编译:

./mvnw clean package

编译完成后,执行以下命令启动Sentinel控制台:

java -jar sentinel-dashboard/target/sentinel-dashboard.jar

2.3 访问控制台

💧在浏览器中访问http://localhost:8080,你应该能够看到Sentinel控制台的登录页面。默认的用户名和密码都是sentinel

3. 初始化演示工程

💧为了演示Sentinel的熔断与限流功能,我们需要创建一个简单的Spring Cloud Alibaba工程。

3.1 创建工程

💧使用你习惯的方式创建一个新的Spring Cloud Alibaba工程,可以使用Spring Initializr或手动创建。

3.2 添加依赖

💧pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

3.3 配置文件

💧application.properties文件中添加以下配置:

# Sentinel控制台配置
spring.cloud.sentinel.transport.dashboard=localhost:8080

# 服务名称
spring.application.name=sentinel-demo

💧localhost:8080替换为你运行Sentinel控制台的地址和端口。

3.4 创建示例接口

💧创建一个简单的REST接口,用于演示Sentinel的熔断与限流功能。在一个新建的DemoController类中,添加以下代码:

@RestController
public class DemoController {

    @GetMapping("/hello")
    @SentinelResource("hello")
    public String hello() {
        return "Hello, Sentinel!";
    }
}

@SentinelResource("hello")注解表示该接口受Sentinel保护,限制其访问频率。

3.5 启动工程

💧运行工程,确保工程能够成功启动。

4. 流控规则

💧在Sentinel控制台中,我们可以配置流控规则,以限制对受保护资源的访问频率。

4.1 创建流控规则

💧在Sentinel控制台中,点击左侧导航栏的"流控规则",然后点击右上角的"新增"按钮。

💧在弹出的对话框中,填写规则信息。例如,我们设置一个QPS阈值为10的规则。

4.2 验证流控规则

💧在浏览器中访问http://localhost:8080/hello,你将看到接口返回的数据。继续刷新页面,当访问超过流控规则中设置的QPS阈值时,将会触发限流,接口将无法正常访问。

5. 服务降级

💧除了限流功能,Sentinel还提供了服务降级的功能,以应对异常情况下的服务调用。

5.1 创建降级规则

💧在Sentinel控制台中,点击左侧导航栏的"降级规则",然后点击右上角的"新增"按钮。

💧在弹出的对话框中,填写规则信息。例如,我们设置一个异常比例阈值为0.5的规则,即当接口调用的异常比例超过50%时,将触发降级。

5.2 验证降级规则

💧在浏览器中访问http://localhost:8080/hello,你将看到接口返回的数据。在代码中,我们可以通过抛出异常来模拟服务调用失败的情况。

💧继续访问接口,并观察接口的返回结果。当接口调用的异常比例超过降级规则中设置的阈值时,接口将会返回降级的结果。

6. 热点key限流

💧除了针对整个接口的限流,Sentinel还支持对特定的热点key进行限流,以应对热点数据的访问。

6.1 创建热点key规则

💧在Sentinel控制台中,点击左侧导航栏的"热点参数限流",然后点击右上角的"新增"按钮。

💧在弹出的对话框中,填写规则信息。例如,我们设置一个参数名称为hotParam的规则,限制该参数的QPS阈值为5。

6.2 验证热点key规则

💧在浏览器中访问http://localhost:8080/hello?hotParam=1,你将看到接口返回的数据。继续访问接口,并在URL中修改hotParam参数的值,当访问超过规则中设置的QPS阈值时,将会触发热点key的限流。

7. 系统规则

💧Sentinel还提供了系统规则,用于限制整个系统的访问流量。

7.1 创建系统规则

💧在Sentinel控制台中,点击左侧导航栏的"系统规则",然后点击右上角的"新增"按钮。

💧在弹出的对话框中,填写规则信息。例如,我们设置一个QPS阈值为20的规则。

7.2 验证系统规则

💧在浏览器中访问http://localhost:8080/hello,你将看到接口返回的数据。继续刷新页面,当访问超过系统规则中设置的QPS阈值时,将会触发系统的限流,接口将无法正常访问。

8. @SentinelResource

💧除了在代码中使用@SentinelResource注解来保护接口,我们还可以使用它来定义自定义的熔断、降级、限流逻辑。

8.1 定义自定义逻辑

💧DemoController类中添加一个新的方法,并使用@SentinelResource注解来定义自定义的逻辑。例如:

@GetMapping("/custom")
@SentinelResource(value = "custom", fallback = "handleFallback", blockHandler = "handleBlock")
public String custom() {
    // 自定义业务逻辑
    return "Custom Logic";
}

// 降级处理方法
public String handleFallback() {
    return "Fallback Logic";
}

// 限流处理方法
public String handleBlock(BlockException ex) {
    return "Block Logic";
}

8.2 验证自定义逻辑

💧在浏览器中访问http://localhost:8080/custom,你将看到接口返回的数据是自定义逻辑中定义的结果。你还可以在Sentinel控制台中配置相应的熔断、降级、限流规则,以触发相应的逻辑。

9. 服务熔断功能规则持久化

💧默认情况下,Sentinel控制台中的规则只在内存中生效,并不会持久化到磁盘。如果希望规则持久化,以防止控制台重启导致规则丢失,可以进行如下配置。

9.1 创建数据库表

💧在你的MySQL数据库中执行以下SQL语句,创建Sentinel控制台的规则持久化表:

CREATE TABLE sentinel_rule (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  app_name VARCHAR(128) NOT NULL,
  resource VARCHAR(255) NOT NULL,
  limit_app VARCHAR(128),
  limit_type INT NOT NULL,
  count INT NOT NULL,
  strategy INT NOT NULL,
  ref_resource VARCHAR(255),
  create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
  update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

9.2 配置数据源

💧在Sentinel控制台的application.properties文件中,添加以下配置,配置数据库的连接信息:

# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/sentinel?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

💧jdbc:mysql://localhost:3306/sentinel替换为你的MySQL数据库连接信息。

9.3 配置规则持久化

💧在Sentinel控制台的application.properties文件中,添加以下配置,启用规则持久化:

# 规则持久化配置
spring.cloud.sentinel.datasource.ds1.nacos.server-addr=localhost:8848
spring.cloud.sentinel.datasource.ds1.nacos.data-id=sentinel_rule
spring.cloud.sentinel.datasource.ds1.nacos.group-id=DEFAULT_GROUP
spring.cloud.sentinel.datasource.ds1.nacos.rule-type=flow

💧localhost:8848替换为你的Nacos配置中心的地址和端口。

9.4 重启Sentinel控制台

💧重启Sentinel控制台,配置的规则将会自动从数据库加载。

在这里插入图片描述


🐳结语

🐬初学一门技术时,总有些许的疑惑,别怕,它们是我们学习路上的点点繁星,帮助我们不断成长。

🐟积少成多,滴水成河。文章粗浅,希望对大家有帮助!

💧参考:

  • Sentinel GitHub仓库
  • Spring Cloud Alibaba官方文档

http://lihuaxi.xjx100.cn/news/1289240.html

相关文章

js内存泄漏及排查详解

js内存泄漏及排查详解 常见内存泄漏及解决方案 内存泄漏&#xff08;Memory Leak&#xff09;是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放&#xff0c;造成系统内存的浪费&#xff0c;导致程序运行速度减慢甚至系统崩溃等严重后果。 隐式全局变量 在局部…

v8-tc39-ecma262:concat,不只是合并数组

如上图&#xff0c;解释如下&#xff1a; 如果是对象o&#xff0c;转换为对象新建数组A设n0,用于最后赋值给A&#xff0c;确保A的长度正确预先把值设置到items(这里不知何意&#xff1f;)循环items&#xff0c;设置元素为E E是否可展开如果可展开 有len下标&#xff0c;则获取…

QT多线程之QtConcurrent::run()

QtConcurren导读 QtConcurrent提供了编写多线程程序的高级api&#xff0c;也即不使用低级线程原语&#xff0c;而其他实现多线程的方式&#xff0c;例如子类化QThread、QObject::moveToThread()、子类化QRunnable对于共享数据的保护都要使用低级线程原语&#xff0c;这无疑是要…

(0day通用)中庆纳博某系统敏感信息泄露+未授权修改密码

申明&#xff1a;本次测试只作为学习用处&#xff0c;请勿未授权进行渗透测试&#xff0c;切勿用于其它用途&#xff01; 1.漏洞背景 北京中庆纳博信息技术有限公司&#xff0c;简称中庆纳博&#xff0c;是有20年历史的中庆集团旗下核心企业&#xff0c;专注于教育信息化的深度…

通过shell的while read line对一个文件中的考试分数进行人员分组

通过shell的while read line对一个文件中的考试分数进行人员分组&#xff0c;并记录分数 [rootecs-18b3 ~]# cat split.sh #!/bin/bash while read line donameecho ${line}|awk {print $1}scoreecho ${line}|awk {print $2}if [ ${score} -gt 90 ];thenecho -e "${name…

linux:Docker 退出容器但不关闭当前容器

参考&#xff1a; Docker 退出容器但不关闭当前容器_docker 怎么把容器hold_leoe_的博客-CSDN博客

前后端交互时数据加密的目的是什么

对于新手在网页开发的时候&#xff0c;总会遇到对数据加密的误解&#xff0c;尤其是刚开始接触相关代码看了一些用例之后90%的人免不了会想过一个问题&#xff0c;就是前后端加解密是为了什么。 例如下面的代码 后端加密代码 import javax.crypto.Cipher; import javax.cryp…

代码随想录算法训练营第2天| 977.有序数组的平方 ,209.长度最小的子数组 ,59.螺旋矩阵II

今日学习的文章链接&#xff0c;或者视频链接 第一章 数组part02 第一章 数组part02 自己看到题目的第一想法 看完代码随想录之后的想法 977: class Solution { public:vector<int> sortedSquares(vector<int>& nums) {int left 0;int right nums.size…