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分支。

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

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

相关文章

一堆让你眼界大开的实用工具网站——搜嗖工具箱

和图书 https://www.hetushu.com/ 一个好用的免费看小说网站。和图书是一个提供各种热门电子书,书籍,小说免费在线阅读的网站&#xff0c;涵盖网游、玄幻、穿越、科幻、仙侠、都市、武侠、历史、竞技、军事灵异等多个种类的小说。在这个网站看小说最大的感触简单干净&#xff…

C++速通LeetCode中等第15题-搜索二维矩阵II(两种方法)

方法一&#xff1a;二分法按行遍历查找&#xff1a; class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {for (const auto& row: matrix) {auto it lower_bound(row.begin(), row.end(), target);if (it ! row.end()…

【C++掌中宝】在正式学习C++之前,你还应该了解哪些东西?

文章目录 前言1. C发展历史1.1 C版本更新1.2 关于C23的一个小故事 2. C参考文档3. C的重要性3.1 编程语言排行榜3.2 C在工作领域中的应用 4. C学习建议和书籍推荐4.1 C学习难度4.2 C学习建议4.3 学习书籍推荐 5. C第一个程序结语 前言 在正式学习C之前&#xff0c;我觉得应该先…

Linux:make,Makefile

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《Linux&#xff1a;make&#xff0c;Makefile》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&…

Java面试篇-AOP专题(什么是AOP、AOP的几个核心概念、AOP的常用场景、使用AOP记录操作日志、Spring中的事务是如何实现的)

文章目录 1. 什么是AOP2. AOP的几个核心概念3. AOP的常用场景4. 使用AOP记录操作日志4.1 准备工作4.1.1 引入Maven依赖4.1.2 UserController.java4.1.3 User.java4.1.4 UserService.java 4.2 具体实现&#xff08;以根据id查询用户信息为例&#xff09;4.2.1 定义切面类&#x…

基于uni-app的计算机类面试宝设计与实现(毕业论文)

目 录 1 前言 1 1.1 研究目的与意义 1 1.2 研究现状 1 1.3 论文结构 2 2 可行性分析 3 2.1 经济可行性 3 2.2 法律可行性 3 2.3 技术可行性 4 2.4 市场可行性 4 2.5 可行性分析结论 4 3 系统需求分析 4 3.1 用户需求分析 4 3.2 系统功能分析 5 3.3 系统性能需求分析 6 4 概要设…

【网络安全 | 靶机搭建】修改镜像源、更新软件源、安装git、更改python版本等

文章目录 0x00、必要准备0x01、修改镜像源0x02、更新软件源并清除缓存0x03、安装git0x04、更改默认Python版本为python30x05、安装增强功能0x06、vmware虚拟机导出iso0x00、必要准备 安装虚拟机时必须保存用户名、密码,用于后续操作,可以截图保存: 以下内容按个人需要进行配…

重生奇迹MU 强化玩法套路多 极品装备由你打造

欢迎来到重生奇迹MU的强化玩法指南&#xff01;想要打造极品装备吗&#xff1f;不可错过这篇文章&#xff0c;我们将为您揭开最多套路的强化技巧和窍门&#xff0c;帮您节省时间和资源&#xff0c;并带来最高效的升级结果。无论您是新手还是老玩家&#xff0c;本文适合所有级别…

AI浪潮新崛起:借助AI+实景/视频直播创新魅力,开启无人自动直播新时代!

AI浪潮新崛起&#xff1a;借助AI实景/视频直播创新魅力&#xff0c;开启无人自动直播新时代&#xff01; 在科技日新月异的今天&#xff0c;人工智能&#xff08;AI&#xff09;已不再仅仅是科幻电影中的桥段&#xff0c;它正以不可阻挡之势渗透到我们生活的方方面面&#xff…

工业物联网的海量数据如何呈现,可视化设计来助力

工业物联网产生的海量数据需要通过可视化设计来呈现&#xff0c;以帮助用户更好地理解和分析数据。 数据汇总和聚合&#xff1a; 对于大量的数据&#xff0c;可以通过汇总和聚合的方式来减少数据的数量&#xff0c;同时保留关键的信息。例如&#xff0c;将时间序列数据按照小…

Excel 冻结多行多列

背景 版本&#xff1a;office 2021 专业版 无法像下图内某些版本一样&#xff0c;识别选中框选的多行多列。 如下选中后毫无反应&#xff0c;点击【视图】->【冻结窗口】->【冻结窗格】后自动设置为冻结第一列。 操作 如下&#xff0c;要把前两排冻结起来。 选择 C1&a…

2024华为杯研赛D题保姆级教程思路分析+教程

2024年中国研究生数学建模竞赛D题保姆级教程思路分析 D题&#xff1a;大数据驱动的地理综合问题&#xff08;数学分析&#xff0c;统计学&#xff09; 关键词&#xff1a;地理、气候、统计&#xff08;细致到此题&#xff1a;统计指标、统计模型、统计结果解释&#xff09; …

视频压缩篇:适用于 Windows 的 10 款最佳视频压缩器

视频压缩器现在对许多想要减小视频大小的视频编辑者来说非常有名。但是&#xff0c;并非所有可以在网上找到的视频压缩器都能产生最佳输出。因此&#xff0c;我们搜索了可以无损压缩视频的最出色的视频压缩器应用程序。本文列出了您可以在离线、在线和手机上使用的十大最佳视频…

FastAdmin列表用echats渲染,使用表格的templateView实现一个图表渲染的功能

前言 FastAdmin中Bootstrap-table表格参数templateView拥有强大的自定义功能&#xff0c;这里我们使用templateView来实现一个图表渲染的功能。 首先我们itemtpl模板中的数据需要填充为一个JSON数据&#xff0c;包含column和data两列 ,chartdata为我们服务器返回的行中的数据。…

力扣-1035不相交的线(Java详细题解)

题目链接&#xff1a;力扣-1035不相交的线 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 dp五部曲。 1.确定dp数组和i下标的含义。 2.确定递推公式。 3.dp初始化。 4.确定dp的遍历顺序。 5.如果没有ac打印dp数组 利于debug。 每一…

nginx模块篇(四)

文章目录 四、Nginx的扩展模块4.1. Lua4.1.1 概念4.1.2 特性4.1.3 应用场景4.1.4 Lua的安装4.1.5 Lua的语法4.1.5.1 第一个Lua程序4.1.5.2 Lua的注释4.1.5.3 标识符4.1.5.4 关键字4.1.5.5 运算符4.1.5.6 全局变量&局部变量4.1.5.7 Lua数据类型nilbooleannumberstringtablef…

串口助手的qt实现思路

要求实现如下功能&#xff1a; 获取串口号&#xff1a; foreach (const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts()) {qDebug() << "Port: " << serialPortInfo.portName(); // e.g. "COM1"qDebug() <<…

绿色数据中心:实现可持续发展和具备盈利能力的全闪存解决方案

数据中心成为了当今数字世界的支柱&#xff0c;负责存储、处理和分发驱动几乎所有数字服务产生&#xff08;从网上银行到即时消息&#xff09;的数据。这使得数字中心逐渐成为了现代商业基础设施的关键组成部分。 但是&#xff0c;随之而来的是&#xff0c;数据中心也已经成为…

基于asp.net固定资产管理系统设计与实现

博主介绍&#xff1a;专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

如何着手创建企业数据目录?(三)权限管理及版本控制

前文导读&#xff1a; 《如何着手创建企业数据目录&#xff1f;&#xff08;一&#xff09;数据目录的设定》 《如何着手创建企业数据目录&#xff1f;&#xff08;二&#xff09;数据的命名与维护》 前面聊过了数据目录的设定、数据命名规则和维护规则&#xff0c;今天我们继续…