我的项目需要引入限流,降级,熔断框架,由于 Spring Cloud 2022.0.4 已经不再支持 Hystrix,Spring Cloud 提供了替代方案,如 Resilience4j,可以使用它来替换 Hystrix。但是网上搜了一下国内Resilience4j使用的人很少,相反Alibaba的Sentinel使用的人非常多,并且也一直在维护,最新的版本v1.8.7 是3周前发布的
Sentinel 的使用可以分为两个部分:
地址:https://github.com/alibaba/Sentinel/releases
当前最新的版本是
启动程序,我这里把启动端口改成了8090,因为8080是自己写程序的默认端口,看着挺奇怪的
java -Dserver.port=8090 -Dcsp.sentinel.dashboard.server=localhost:8090 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
如果需要设置开机自起,可以参考我的另一篇文章:Centos7 如何设置开机启动某个程序-CSDN博客
这里的IP改成自己机器IP
默认用户名和密码都是?sentinel
<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
spring:
cloud:
sentinel:
transport:
dashboard: 192.168.31.110:8090
port: 8719
这里的dashboard 配的与sentinel.dashboard 服务的地址
port 则是当前服务的agent 端口,sentinel 会在你的应用中启动另一个特殊端口与sentinel.dashboard通信
启动我们的SpringBoot服务
随便用个接口请求一下自己SpringBoot服务
如果能看到下面这几行日志,说明本地的sentinel?agent 启动成功了
顺利的话已经有监控数据了
我在操作的时候刚开始,sentinel.dashboard部署在本机Window就正常通信,一旦我部署到虚拟机的Centos上就通信失败,后来找到原因是因为sentinel.dashboard需要反过来跟sentinel?agent 通信,所以也就是说,双方的网络都必须是互通的,本来我们网络是互通的,但犹豫我Window电脑有3个网卡,注册的时候系统随机选了一个网卡的IP地址,导致Centos无法访问我的Window上的Agent应用解决方案:SpringBoot 服务注册IP选择问题-CSDN博客
访问sentinel.dashboard,
单机阈值选择需要限流的阈值,点击新增进行确认。(为了便于演示效果,这里将值设置成了 1)。
上次测试单机最高吞吐量为110/s?
这次我们限流 50 QPS,用100个线程去压测5分钟,看看程序能抗QPS为多少?(忽略出现限流错误)
从下图中我们可以看到压测的最高的QPS 已经达到了上千,程序依旧稳定运行,并没有崩溃,并且每秒有50QPS仍然正常给用户提供服务,说明sentinel 给我们程序提供了很好的保护作用
对比不加sentinel 的100线程压测结果,吞吐量 115 -> 741 (提升了很多)
无限流
限流50
加了sentinel 限流吞吐量增加了10倍,关键是平均时延迟从原来的2885ms降到了之前的1/10 正常耗时范围200多ms,也就是说,请求的用户量越多,sentinel 限流的作用越明显!!!