SpringCloud Alibaba五大组件之——Sentinel
SpringCloud Alibaba五大组件之——Sentinel(文末附有完整项目GitHub链接)
- 前言
- 一、什么是Sentinel
- 二、Sentinel控制台
- 1.下载jar包
- 2.自己打包
- 3.启动控制台
- 4.浏览器访问
- 三、项目中引入Sentinel
- 1.在api-service模块的pom文件引入依赖:
- 2.application.yml
- 3.补充:jvm启动参数
- 4.编写简单的测试程序
- 5.@SentinelResource注解
- 6.其他方式
- 四、规则讲解
- 1.代码中硬编码
- 2.控制台配置(生产环境中不推荐)
- (1)左侧菜单栏添加
- (2)簇点链路中添加
- 3.为何不推荐控制台中添加
- 五、生产环境下,规则集成Nacos
- 1.引入依赖
- 2.Nacos中新增config
- 3.application.yml文件修改
- 4.重启
- 六、结语
前言
前文,我们已经介绍了SpringCloud Alibaba五大组件中的两个:dubbo和nacos,文章连接:太细了有手就行,SpringCloud Alibaba+Nacos+Dubbo整合,有需要的可以去查阅。
ps:本文用到的项目demo也是基于这篇文章去扩展的,包括模块结构和版本依赖等等。
一、什么是Sentinel
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、流量路由、熔断降级、系统自适应过载保护、热点流量防护等多个维度保护服务的稳定性。
Sentinel 具有以下特征:
-
丰富的应用场景:Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
-
完备的实时监控:Sentinel 同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至 500 台以下规模的集群的汇总运行情况。
-
广泛的开源生态:Sentinel 提供开箱即用的与其它开源框架/库的整合模块,例如与 Spring Cloud、Apache Dubbo、gRPC、Quarkus 的整合。您只需要引入相应的依赖并进行简单的配置即可快速地接入 Sentinel。同时 Sentinel 提供 Java/Go/C++ 等多语言的原生实现。
-
完善的 SPI 扩展机制:Sentinel 提供简单易用、完善的 SPI 扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
Sentinel 的主要特性:

上面内容都是引用于官网
二、Sentinel控制台
官方提供两种方式跑控制台,我建议没有特殊需求下,通通用第一种就行
1.下载jar包
打来Sentinel的官网:https://github.com/alibaba/Sentinel/releases,找到自己需要的版本下载,本文编写时最高版本是1.8.8,本文用的是1.8.6版本

版本问题作者这里再啰嗦一句,一定要选对,因为我这一系列文章,SpringCloud alibaba定的是2021.0.6.0,所以一切版本如下图来选,直接毕业版本。

2.自己打包
下载整个工程,用mvn clean package打成jar包
3.启动控制台
打开cmd,进入jar包的目录,执行一下代码:
java -Dserver.port=8180 -Dcsp.sentinel.dashboard.server=localhost:8180 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard-1.8.6.jar
其中 -Dserver.port=8180 用于指定 Sentinel 控制台端口为 8180,默认8080
dashboard.server:网页的端口,客户端必须按指定的访问,也可以省略,默认是127.0.0.1:8080
4.浏览器访问
访问:http://localhost:8180,默认账户和密码都是sentinel

登录,显示这个界面则成功

三、项目中引入Sentinel
1.在api-service模块的pom文件引入依赖:
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>
2.application.yml
修改配置文件,新加如下配置:
spring:cloud:sentinel:transport:port: 8719dashboard: localhost:8180
此处的port,默认是8179,主要就是项目启动后,会自行启动一个HTTP server,通过这个端口和sentinel客户端进行交互,来传输数据。
dashboard: localhost:8180,这个要和上一步启动sentinel控制台时候的ip端口一致。
3.补充:jvm启动参数
只要你前面配置和项目都正确,这一步可以省略,但是如果你项目启动,sentinel控制台服务注册不上,你就jvm加入下面参数:
-Dcsp.sentinel.dashboard.server=127.0.0.1:8180
4.编写简单的测试程序
controller:
@RestController
@RequestMapping("/testSentinel")
public class SentinelController {@ResourceUserInfoService userInfoService;@RequestMapping("/one")public void testThree() {userInfoService.testSentinel();}
}
service:
@Service
public class UserInfoServiceImpl{@Override@SentinelResource(value = "testSentinel", blockHandler = "testBlockHandler", fallback = "testFallback")public void testSentinel() {System.out.println("testSentinel");//这行代码是为了测试报错熔断,如果只是流控测试,此行代码可以屏蔽//int a = 1/0;}public void testBlockHandler(BlockException ex) {System.out.println("进入testBlockHandler");}public void testFallback(Throwable e) {System.out.println("进入testFallback");e.printStackTrace();}
}
浏览器访问一下接口
查看控制台,这里可以看到我们的测试接口,项目已经集成好了sentinel

PS:1.因为sentinel是懒加载,这里一定要浏览器随便访问一个接口,不然服务注册不上,也可以添加配置:spring.cloud.sentinel.eager:true实现服务器启动了自动心跳注册。
2.访问了要等个几秒钟,有延迟,刷新一下就能看到了。
5.@SentinelResource注解
常用的几个注解参数:
- value:定义资源名
- blockHandler:会在原方法被限流/降级/系统保护的时候调用,记得方法定义在同一个类中。
- fallback: 会针对所有类型的异常,出现时调用
- defaultFallback:全局默认出异常时候调用,定义了fallback,则此参数不生效
6.其他方式
当然除了注解之外,还提供了其他编码方式去控制一段代码或者一个方法的访问,比如最常见的SphU.entry,大家也可以去官网上查阅根据需求选择
try {// 资源名可使用任意有业务语义的字符串,注意数目不能太多(超过 1K),超出几千请作为参数传入而不要直接作为资源名// EntryType 代表流量类型(inbound/outbound),其中系统规则只对 IN 类型的埋点生效entry = SphU.entry("自定义资源名");// 被保护的业务逻辑// do something...
} catch (BlockException ex) {// 资源访问阻止,被限流或被降级// 进行相应的处理操作
} catch (Exception ex) {// 若需要配置降级规则,需要通过这种方式记录业务异常Tracer.traceEntry(ex, entry);
} finally {// 务必保证 exit,务必保证每个 entry 与 exit 配对if (entry != null) {entry.exit();}
}
四、规则讲解
这里会讲几个常用的配置,其余的配置大家可以去官方查看:sentinel官网,配置规则主要有两种方式,第一种是代码中硬编码,第二种是通过控制台配置的形式
1.代码中硬编码
先介绍下,java代码中的几个规则对象:
- DegradeRule:熔断降级,主要是当一个接口不可访问后,进行的一系列操作,避免所有请求堵塞
- AuthorityRule: 授权规则(来源访问),判断来源请求是否放行,常用的场景是黑白名单
- FlowRule: 流量控制规则,监控QPS,避免系统被瞬时的流量高峰冲垮
- ParamFlowRule: 热点参数限流,可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效
- SystemRule:系统保护规则,当系统负载高于某个阈值,就禁止或者减少流量的进入;当 load 开始好转,则恢复流量的进入
当然还有网关控制和集群流量控制,这两者在代码中无法实现,只有通过控制台配置。
我们就拿熔断规则来举例,在service中,增加如下规则初始化方法:
@PostConstructpublic void initRule() {//熔断规则: 5s内调用接口出现异常次数超过5的时候, 进行熔断List<DegradeRule> degradeRules = new ArrayList<>();DegradeRule rule = new DegradeRule();rule.setResource("testSentinel");rule.setCount(5);//统计时长rule.setStatIntervalMs(5000);rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);//熔断规则//熔断时长rule.setTimeWindow(10);degradeRules.add(rule);DegradeRuleManager.loadRules(degradeRules);}
大家可以在文末获取代码自行去测试。
2.控制台配置(生产环境中不推荐)
控制台中我们有两种方式去添加流控规则
第一种方式:
(1)左侧菜单栏添加


注意这里的资源名,和我们代码中的资源名要匹配,不然配置不会生效。
(2)簇点链路中添加


在链路中添加,可以保证我们的资源名是一定存在的,两种添加方式,你自己选择喜欢的。
3.为何不推荐控制台中添加
因为控制台中添加规则,会推送到项目的内存中,重启就没了,不能持久化,所以在生产环境中不推荐,总不能你每次重启项目都要单独配置一次。
五、生产环境下,规则集成Nacos
生产环境下,都用的Nacos统一管理规则,就是常说的push规则,通过Nacos推送到sentinel控制台,然后再更新到项目中。这样即使项目重启,只要Nacos还在,配置就是接近持久化的状态。
1.引入依赖
由于spring-cloud-starter-alibaba-sentinel 的Maven依赖并没有引入Nacos相关的,所以我们要单独引入依赖:
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency>
2.Nacos中新增config
新增一个流量控制的config

选取json格式:
[{"resource": "testSentinel","limitApp": "default","grade": 1,"count": 2,"strategy": 0,"controlBehavior": 0,"clusterMode": false}
]
- resource:资源名,即限流规则的作用对象
- limitApp:流控针对的调用来源,若为 default 则不区分调用来源
- grade:限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制
- count:限流阈值
- strategy:调用关系限流策略
- controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)
- clusterMode:是否为集群模式
3.application.yml文件修改
在前面的基础上,新增datasource的配置:
注意,这里的nacos一定要和上一步新增的对应,
spring:cloud:sentinel:transport:port: 8719dashboard: localhost:8180datasource:ds:nacos:server-addr: 172.16.72.132:8848data-id: sentinel-rulenamespace: 76dae550-4133-44d8-b591-dc82f5f97b6egroup-id: SENTINEL_PROVIDER_GROUPusername: nacospassword: nacosdata-type: jsonrule-type: flow
由于spring.cloud.sentinel.datasource属性对应的是一个Map,所以它的需要自定义指定Map的KEY,下面的配置中ds就作为KEY,然后后面就可以配置不同的数据源
4.重启
重启后,查看sentinel控制台,可以看到我们在nacos定义的规则
测试一下新加的流控规则,我们是定义的qps不超过2,超过的请求全部拒绝(默认),这里补充一下拒绝策略。
- 快速失败:超过设置阈值的请求全部拒绝,请求失败
- Warm Up :
- 排队等待:

可以看到,标记1和标记2都能正常打印,当第三个请求来了的时候,“进入testFallback”就不打印了,转而进入了blockHandler方法,说明流控是生效了的。
六、结语
到这里,SpringCloud alibaba五大组件之一的流控熔断降级sentinel就讲解完了,欢迎大家评论区指点,后面还剩两个组件:分布式队列RocketMQ和分布式事务Seata,RocketMQ可能会找个时间再写一篇文章,但是Seata的话,如果项目比较庞大,加上事务会顶不住,qps明显降低很多,我一个阿里工作的朋友给我谈过,他们项目组的微服务,都是裸奔的没有用事务,所以这文章我再考虑出不出,其实本文项目中的一个分支seata,我是已经实现了整合的,但是感觉生产环境中又不试用,就没有发出来,后面看情况吧
附上项目GitHub链接:https://github.com/wangqing-github/DubboAndNacos/tree/sentinel,选取sentinel分支。
相关文章:
SpringCloud Alibaba五大组件之——Sentinel
SpringCloud Alibaba五大组件之——Sentinel(文末附有完整项目GitHub链接) 前言一、什么是Sentinel二、Sentinel控制台1.下载jar包2.自己打包3.启动控制台4.浏览器访问 三、项目中引入Sentinel1.在api-service模块的pom文件引入依赖:2.applic…...
brpc之io事件分发器
结构 #mermaid-svg-v4SjrdGXadMO4udP {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-v4SjrdGXadMO4udP .error-icon{fill:#552222;}#mermaid-svg-v4SjrdGXadMO4udP .error-text{fill:#552222;stroke:#552222;}#merm…...
MySQL | 知识 | 从底层看清 InnoDB 数据结构
文章目录 一、InnoDB 简介InnoDB 行格式COMPACT 行格式CHAR(M) 列的存储格式VARCHAR(M) 最多能存储的数据记录中的数据太多产生的溢出行溢出的临界点 二、表空间文件的结构三、InnoDB 数据页结构页页的概览Infimum 和 Supremum使用Page Directory页的真实面貌 四、B 树是如何进…...
es的封装
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、类和接口介绍0.封装思想1.es的操作分类 二、创建索引1.成员变量2.构造函数2.添加字段3.发送请求4.创建索引总体代码 三.插入数据四.删除数据五.查询数据 前…...
写一个自动化记录鼠标/键盘的动作,然后可以重复执行的python程序
import sys import threading import time from PyQt5.QtWidgets import * from auto_fun import * import pyautogui import pynput from PyQt5.QtCore import pyqtSignal from MouseModule import * from pynput import keyboardlocal_list [] # 保存操作坐标、动作、文本 …...
Spring Boot-热部署问题
Spring Boot 热部署问题分析与解决方案 热部署(Hot Deployment)是指在应用程序运行过程中,无需停止应用就可以动态加载新代码、配置或资源,从而提升开发效率。在 Spring Boot 开发中,热部署是一项非常实用的功能&…...
深度学习——管理模型的参数
改编自李沐老师《动手深度学习》5.2. 参数管理 — 动手学深度学习 2.0.0 documentation (d2l.ai) 在深度学习中,一旦我们选择了模型架构并设置了超参数,我们就会进入训练阶段。训练的目标是找到能够最小化损失函数的模型参数。这些参数在训练后用于预测&…...
芯片验证板卡设计原理图:372-基于XC7VX690T的万兆光纤、双FMC扩展的综合计算平台 RISCV 芯片验证平台
基于XC7VX690T的万兆光纤、双FMC扩展的综合计算平台 RISCV 芯片验证平台 一、板卡概述 基于V7的高性能PCIe信号处理板,北京太速科技板卡选用Xilinx 公司Virtex7系列FPGA XC7VX690T-2FFG1761C为处理芯片,板卡提供两个标准FMC插槽,适用于…...
【软设】 系统开发基础
【软设】 系统开发基础 一.软件工程概述 (了解一下大概的流程就行) 1. 可行性分析与项目开发计划 目的:评估项目的经济性、技术性和运营性,判断项目是否值得投资和开发。确定开发时间、预算、所需资源等。 可行性分析ÿ…...
Linux移植之系统烧写
直接参考【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.81 本文仅作为个人笔记使用,方便进一步记录自己的实践总结。 前面我们已经移植好了 uboot 和 linux kernle,制作好了根文件系统。但是我们移植都是通过网络来测试的,在实际的产品开发中…...
【数据结构与算法】LeetCode:双指针法
文章目录 LeetCode:双指针法正序同向而行(快慢指针)移除元素移动零(Hot 100)删除有序数组中的重复项颜色分类(Hot 100)压缩字符串移除链表元素删除排序链表中的重复元素删除排序链表中的重复元素…...
Istio下载及安装
Istio 是一个开源的服务网格,用于连接、管理和保护微服务。以下是下载并安装 Istio 的步骤。 官网文档:https://istio.io/latest/zh/docs/setup/getting-started/ 下载 Istio 前往Istio 发布页面下载适用于您的操作系统的安装文件,或者自动…...
Redis基础数据结构之 Sorted Set 有序集合 源码解读
目录标题 Sorted Set 是什么?Sorted Set 数据结构跳表(skiplist)跳表节点的结构定义跳表的定义跳表节点查询层数设置 Sorted Set 基本操作 Sorted Set 是什么? 有序集合(Sorted Set)是 Redis 中一种重要的数据类型,…...
蓝队技能-应急响应篇Web内存马查杀JVM分析Class提取诊断反编译日志定性
知识点: 1、应急响应-Web内存马-定性&排查 2、应急响应-Web内存马-分析&日志 注:传统WEB类型的内存马只要网站重启后就清除了。 演示案例-蓝队技能-JAVA Web内存马-JVM分析&日志URL&内存查杀 0、环境搭建 参考地址:http…...
递归快速获取机构树型图
一般组织架构都会有层级关系,根部门的parentId一般设置为null或者0等特殊字符,而次级部门及以下的parentId则指向他们父节点的id。 以此为基础,业务上经常会有查询整个组织架构层级关系的需求,返回对象中的children属性用来存储子…...
[Web安全 网络安全]-XSS跨站脚本攻击
文章目录: 一:前言 1.定义 2.漏洞出现的原因 3.鉴别可能存在XSS漏洞的地方 4.攻击原理 5.危害 6.防御 7.环境 7.1 靶场 7.2 自动扫描工具 7.3 手工测试工具 8.payload是什么 二:常用的标签语法 三:XSS的分类 反射…...
数据库数据恢复—SQL Server附加数据库出现“错误823”怎么恢复数据?
SQL Server数据库故障: SQL Server附加数据库出现错误823,附加数据库失败。数据库没有备份,无法通过备份恢复数据库。 SQL Server数据库出现823错误的可能原因有:数据库物理页面损坏、数据库物理页面校验值损坏导致无法识别该页面…...
Vscode 中新手小白使用 Open With Live Server 的坑
背景 最近在家学习尝试前端项目打包的一些事项,既然是打包,那么肯定就会涉及到对打包后文件的访问,以直观的查看打包后的效果 那么肯定就会使用到 Vscode 中 Open With LIve Server 这个功能了,首先这个是一个叫 Live Server 的…...
【深度学习 transformer】Transformer与ResNet50在自定义数据集图像分类中的效果比较
在深度学习领域,图像分类是一个经典且重要的任务。近年来,Transformer架构在自然语言处理领域取得了显著成功,逐渐被引入计算机视觉任务。与此同时,ResNet50作为一种经典的卷积神经网络(CNN),在…...
【系统架构设计师】专业英语90题(附答案详解)
更多内容请见: 备考系统架构设计师-核心总结索引 文章目录 【第1~5题】【第6~10题】【第11~15题】【第16~20题】【第21~25题】【第26~30题】【第31~35题】【第36~40题】【第41~45题】【第46~50题】【第51~55题】【第56~60题】【第61~65题】【第66~70题】【第71~75题】【第76~8…...
Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)
概述 在 Swift 开发语言中,各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过,在涉及到多个子类派生于基类进行多态模拟的场景下,…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...
