SpringBoot 3.1.7 集成Sentinel
一、背景
我的项目需要引入限流,降级,熔断框架,由于 Spring Cloud 2022.0.4 已经不再支持 Hystrix,Spring Cloud 提供了替代方案,如 Resilience4j,可以使用它来替换 Hystrix。但是网上搜了一下国内Resilience4j使用的人很少,相反Alibaba的Sentinel使用的人非常多,并且也一直在维护,最新的版本v1.8.7 是3周前发布的


二、Sentinel 介绍
Sentinel 的使用可以分为两个部分:
- 核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持(见 主流框架适配)。
- 控制台(Dashboard):Dashboard 主要负责管理推送规则、监控、管理机器信息等。
参考官网:quick-start | Sentinel
三、安装Dashboard
1. 下载 Dashboard
地址:https://github.com/alibaba/Sentinel/releases
当前最新的版本是
sentinel-dashboard-1.8.7.jar
2. 点击下载

3. 上传到服务器
启动程序,我这里把启动端口改成了8090,因为8080是自己写程序的默认端口,看着挺奇怪的
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
如果需要设置开机自起,可以参考我的另一篇文章:Centos7 如何设置开机启动某个程序-CSDN博客
4. 访问面板
http://192.168.31.110:8090
这里的IP改成自己机器IP
默认用户名和密码都是 sentinel

四、SpringBoot 3.1.7 应用程序如何集成
参考官网地址: https://github.com/alibaba/spring-cloud-alibaba/blob/2.2.x/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md
1. 添加依赖包
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency><!-- 添加依赖管理 -->
<dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2022.0.0.0</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
这里一定一定要注意版本一致性问题,如果版本引用错了,服务启动时不会加载sentinel
我的SpringBoot3.1.7 对应的Alibaba.cloud 版本号是2022.0.0.0
2. 添加配置信息
spring:cloud:sentinel:transport:dashboard: 192.168.31.110:8090port: 8719
这里的dashboard 配的与sentinel.dashboard 服务的地址
port 则是当前服务的agent 端口,sentinel 会在你的应用中启动另一个特殊端口与sentinel.dashboard通信
3. 启动测试sentinel
启动我们的SpringBoot服务
随便用个接口请求一下自己SpringBoot服务

如果能看到下面这几行日志,说明本地的sentinel agent 启动成功了

4. 查看sentinel 面板
顺利的话已经有监控数据了

我在操作的时候刚开始,sentinel.dashboard部署在本机Window就正常通信,一旦我部署到虚拟机的Centos上就通信失败,后来找到原因是因为sentinel.dashboard需要反过来跟sentinel agent 通信,所以也就是说,双方的网络都必须是互通的,本来我们网络是互通的,但犹豫我Window电脑有3个网卡,注册的时候系统随机选了一个网卡的IP地址,导致Centos无法访问我的Window上的Agent应用解决方案:SpringBoot 服务注册IP选择问题-CSDN博客

五、配置限流规则并验证
访问sentinel.dashboard,
1. 单击 流控规则 ,然后点击 “新增流控规则”

2. 填写需要限流的 URL 相对路径
单机阈值选择需要限流的阈值,点击新增进行确认。(为了便于演示效果,这里将值设置成了 1)。

3. 快速点击postman请求,此时我们发现已经返回了限流

六、给sentinel配置数据源
1. 介绍
如果不配置数据源,当应用重启后,限流等配置信息都会丢失,需要再次重新配置
因为我选用的Consul作为我的注册和配置中心,那么我就选用Consul作为sentinel的数据源。
如果不是用Consul作为我的注册和配置中心可以跳过这一步
参考文档:
https://github.com/alibaba/spring-cloud-alibaba/blob/2022.x/spring-cloud-alibaba-examples/sentinel-example/sentinel-core-example/readme-zh.md
官方介绍说: Sentinel starter 整合了目前存在的几类 ReadableDataSource。只需要在配置文件中进行相关配置,即可在 Spring 容器中自动注册 DataSource。
但是很遗憾: 目前支持file, nacos, zk, apollo,redis 这5种类型。
于是我找到了sentinel-datasource-consul 的git地址:
https://github.com/alibaba/Sentinel/tree/1.8.6/sentinel-extension/sentinel-datasource-consul
难过的是官网就这么点文档(内心:虽然我写代码也经常不喜欢写文档,但是你好歹写一下配置文档啊):

2. 添加依赖
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-consul</artifactId><version>1.8.6</version></dependency>
3. 查看配置过程
无奈,我只能翻翻源码,看看怎么配置,找到这个类
com.alibaba.cloud.sentinel.datasource.config.ConsulDataSourceProperties

看来要配置这几个类

结果启动包这个错误
java.lang.NullPointerException: Cannot invoke "com.alibaba.cloud.sentinel.datasource.RuleType.getName()" because the return value of "com.alibaba.cloud.sentinel.datasource.config.AbstractDataSourceProperties.getRuleType()" is null
于是我找到对应的RuleType,Flow 表示限流类型

终于不报错误了
4. 最终配置如下
spring:cloud:sentinel:transport:dashboard: 192.168.31.110:8090port: 8719datasource:ds1:consul:host: 192.168.31.110port: 8500ruleKey: sentinel_flow_rulewatchTimeout: 5ruleType: flow
5. 配置限流规则

然后重启服务,规则仍然没有

查找资料才知道:
在Sentinel Dashboard上修改流控规则后并不会同步到Nacos,目前Sentinel Dashboard不支持该功能。
(希望未来能支持吧)
那么只能我们手动配置
6. 限流配置文档参考文档
https://github.com/alibaba/Sentinel/wiki/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8#%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6%E8%A7%84%E5%88%99-flowrule
7. 限流配置步骤
登录 Consul平台
http://192.168.31.110:8500/ui/dc1/kv
点击create按钮

[{"resource": "/submitOrder","count": 5}
]
再次打开Sentinel 控制面板的流控规则,可以看到Consul配置的规则已经加载进去了

8. 在线更新Consul配置值
不需要重启应用,实时同步到Sentinel

七、限流后的压力测试
我们接着电商系统设计到开发02 单机性能压测-CSDN博客
1. 准备工作
上次测试单机最高吞吐量为110/s
这次我们限流 50 QPS,用100个线程去压测5分钟,看看程序能抗QPS为多少?(忽略出现限流错误)


2. 压测结果
从下图中我们可以看到压测的最高的QPS 已经达到了上千,程序依旧稳定运行,并没有崩溃,并且每秒有50QPS仍然正常给用户提供服务,说明sentinel 给我们程序提供了很好的保护作用


对比不加sentinel 的100线程压测结果,吞吐量 115 -> 741 (提升了很多)

3. 提示压测线程数300结果
无限流

限流50

加了sentinel 限流吞吐量增加了10倍,关键是平均时延迟从原来的2885ms降到了之前的1/10 正常耗时范围200多ms,也就是说,请求的用户量越多,sentinel 限流的作用越明显!!!
相关文章:
SpringBoot 3.1.7 集成Sentinel
一、背景 我的项目需要引入限流,降级,熔断框架,由于 Spring Cloud 2022.0.4 已经不再支持 Hystrix,Spring Cloud 提供了替代方案,如 Resilience4j,可以使用它来替换 Hystrix。但是网上搜了一下国内Resilie…...
Elastic Stack 8.12:通过对 ES|QL 等的改进增强了向量搜索
作者:来自 Elastic Tyler Perkins, Shani Sagiv, Gilad Gal, Ninoslav Miskovic Elastic Stack 8.12 构建于 Apache Lucene 9.9(有史以来最快的 Lucene 版本)之上,基于我们对标量量化和搜索并发性的贡献,为文本、向量和…...
结构体的内存对齐(计算题常考点)
许久不见我考完试回来啦,让我们接着将结构体进行到底! 目录 结构体对齐的意义: 结构体对齐的实现: 对齐规则: 训练: 好到这里误区来了: 总结: 往期回顾: 下期预告&…...
设置Json对象输出字段顺序
场景 通过情况下对前端输出json格式不需要关注字段顺序,但某些特殊场景需要设置字段输出顺序(例nginx需要对特殊字段顺序进行加密处理);框架有默认的顺序,如 jackson 默认使用字段声明的顺序, fastjson 默认是使用字典序。 jackso…...
当 OpenTelemetry 遇上阿里云 Prometheus
作者:逸陵 背景 在云原生可观测蓬勃发展的当下,想必大家对 OpenTelemetry & Prometheus 并不是太陌生。OpenTelemetry 是 CNCF(Cloud Native Computing Foundation)旗下的开源项目,它的目标是在云原生时代成为应…...
【Flink-1.17-教程】-【四】Flink DataStream API(1)源算子(Source)
【Flink-1.17-教程】-【四】Flink DataStream API(1)源算子(Source) 1)执行环境(Execution Environment)1.1.创建执行环境1.2.执行模式(Execution Mode)1.3.触发程序执行…...
【蓝桥杯EDA设计与开发】资料汇总以及立创EDA及PCB相关技术资料汇总(持续更新)
[18/01/2024]:目前为了准备蓝桥杯做一些资料贴,于是写下这一篇博客。 各种资料均来源于网络以及部分书籍、手册等文档,参考不保证其准确性。 如果在准备蓝桥杯,可与我私信共同学习!!!…...
JavaEE学习笔记 2024-1-18 --模块化Controller层、AJAX与JSON
上一篇 个人整理非商业用途,欢迎探讨与指正!! 文章目录 11.模块化Controller层12.AJAX12.1使用场景 13.JSON13.1如何使用后端发送JSON数据 11.模块化Controller层 将对应模块的Servlet写入到一个指定的模块中,模块化编程 使用switch方式 p…...
rpc跨平台通信的简单案例,java和go
当我们使用Go和Java进行RPC(Remote Procedure Call,远程过程调用)跨平台通信时,你可以使用gRPC作为通信框架。gRPC是一个高性能、开源的RPC框架,它支持多种编程语言,包括Go和Java。下面我将为你提供一个简单…...
Java设计模式之观察者模式详解
Java设计模式之观察者模式详解 大家好,我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,我们将一同深入探讨Java设计模式之观察者模式,这是一种代…...
分布式锁实现(mysql,以及redis)以及分布式的概念
道生一,一生二,二生三,三生万物 我旁边的一位老哥跟我说,你知道分布式是是用来干什么的嘛?一句话给我干懵了,我能隐含知道,大概是用来做分压处理的,并增加系统稳定性的。但是具体如…...
实现分布式锁:Zookeeper vs Redis
目录 引言 1. Zookeeper分布式锁 1.1特点和优势: 强一致性 顺序节点 Watch机制 1.2 Zookeeper分布式锁代码示例 2. Redis分布式锁 2.1特点和优势: 简单高效 可续租性 灵活性 2.2Redis分布式锁代码示例 3.对比和选择 3.1 一致性要求 3.2…...
电脑录屏必备技能,让分享变得更加简单!
随着网络技术的飞速发展,电脑录屏已经成为日常工作和学习中不可或缺的一部分。无论是录制在线课程、游戏解说、软件教程,还是远程会议、演示文稿等,电脑录屏都有着广泛的应用。接下来,本文将介绍三种常见的电脑录屏方法࿰…...
重构改善既有代码的设计-学习(一):封装
1、封装记录(Encapsulate Record) 一些记录性结构(例如hash、map、hashmap、dictionary等),一条记录上持有什么字段往往不够直观。如果其使用范围比较宽,这个问题往往会造成许多困扰。所以,记录…...
Python图像处理【19】基于霍夫变换的目标检测
基于霍夫变换的目标检测 0. 前言1. 使用圆形霍夫变换统计图像中圆形对象2. 使用渐进概率霍夫变换检测直线2.1 渐进霍夫变换原理2.2 直线检测 3. 使用广义霍夫变换检测任意形状的对象3.1 广义霍夫变换原理3.2 检测自定义形状 小结系列链接 0. 前言 霍夫变换 (Hough Transform,…...
Spring+SprinMVC+MyBatis注解方式简易模板
SpringSprinMVCMyBatis注解方式简易模板代码Demo GitHub访问 ssm-tpl-anno 一、数据准备 创建数据库test,执行下方SQL创建表ssm-tpl-cfg /*Navicat Premium Data TransferSource Server : 127.0.0.1Source Server Type : MySQLSource Server Version :…...
Python基础第五篇(Python数据容器)
文章目录 一、数据容器入门二、数据容器 list 列表(1),list 列表定义(2),list列表的索引(3),list列表的常见操作(4),list列表的遍历 三、数据容器:tuple(元组)(1),tuple元组定义(2),tuple元组的索引(3),tuple元组的常见操作(4),tuple元组的遍…...
【H3C】配置AAA认证和Telnet远程登陆,S5130 Series交换机
AAA配置步骤为: 1.开启telent远程登陆服务 2.创建用户,设置用户名、密码、用户的服务类型 3.配置终端登录的数量 4.配置vlan-if的ip地址,用来远程登陆 5.允许对应的vlan通过 1.开启telent远程登陆服务 sys …...
GaussDB数据库中的MERGE INTO介绍
一、前言 二、GaussDB MERGE INTO 语句的原理概述 1、MERGE INTO 语句原理 2、MERGE INTO 的语法 3、语法解释 三、GaussDB MERGE INTO 语句的应用场景 四、GaussDB MERGE INTO 语句的示例 1、示例场景举例 2、示例实现过程 1)创建两个实验表,并…...
2024年上海高考数学最后四个多月的备考攻略,目标140+
亲爱的同学们,寒假已经来临,春节即将到来,距离2024年上海高考已经余额不足5个月了。作为让许多学子头疼,也是拉分大户的数学科目,你准备好了吗?今天,六分成长为您分享上海高考数学最后四个多月的…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)
宇树机器人多姿态起立控制强化学习框架论文解析 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一) 论文解读:交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...
