当前位置: 首页 > news >正文

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。

但是很遗憾: 目前支持filenacoszkapolloredis 这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 限流的作用越明显!!!

http://www.lryc.cn/news/285400.html

相关文章:

  • Elastic Stack 8.12:通过对 ES|QL 等的改进增强了向量搜索
  • 结构体的内存对齐(计算题常考点)
  • 设置Json对象输出字段顺序
  • 当 OpenTelemetry 遇上阿里云 Prometheus
  • 【Flink-1.17-教程】-【四】Flink DataStream API(1)源算子(Source)
  • 【蓝桥杯EDA设计与开发】资料汇总以及立创EDA及PCB相关技术资料汇总(持续更新)
  • JavaEE学习笔记 2024-1-18 --模块化Controller层、AJAX与JSON
  • rpc跨平台通信的简单案例,java和go
  • Java设计模式之观察者模式详解
  • 分布式锁实现(mysql,以及redis)以及分布式的概念
  • 实现分布式锁:Zookeeper vs Redis
  • 电脑录屏必备技能,让分享变得更加简单!
  • 重构改善既有代码的设计-学习(一):封装
  • Python图像处理【19】基于霍夫变换的目标检测
  • Spring+SprinMVC+MyBatis注解方式简易模板
  • Python基础第五篇(Python数据容器)
  • 【H3C】配置AAA认证和Telnet远程登陆,S5130 Series交换机
  • GaussDB数据库中的MERGE INTO介绍
  • 2024年上海高考数学最后四个多月的备考攻略,目标140+
  • SSL证书自动化管理有什么好处?如何实现SSL证书自动化?
  • 路由器初始化配置、功能配置
  • node介绍
  • 海外抖音TikTok、正在内测 AI 生成歌曲功能,依靠大语言模型 Bloom 进行文本生成歌曲
  • 【ARM 嵌入式 编译系列 3.6 -- 删除lib中的某个文件】
  • web架构师编辑器内容-图层拖动排序功能的开发
  • 3.RHCSA脚本配置及通过node2改密码
  • AtCoder Regular Contest 170(A~B)
  • rk1126, 实现 yolov8 目标检测
  • 【软件测试】学习笔记-网站可扩展性架构设计
  • 深度学习常用代码总结(k-means, NMS)