echo编辑整理,欢迎转载,转载请声明文章来源。欢迎添加echo微信(微信号:t2421499075) 交流学习。
上文我们已经认识了Sentinel,并且使用了Sentinel来进行流控。但是可能很多人都没有去关注在我们的项目服务关闭之后,我们的流控规则是否存在的问题。如果关注过,我们不难发现,服务关闭之后,我们可以看到Sentinel控制台中,流控规则已经不存在了。本文就是主要来解决这个问题
服务关闭,流控规则就不见了
我们可以通过关闭服务来观看到这个现状,服务关闭之后,Sentinel的控制台的监控里面就看不到了我们之前对服务配置的流控规则了。这里我们不妨想想,为什么服务关闭之后,流控规则就不见了?我们存在内存中的东西,是不是服务关闭,内存就丢失了。从这里我们不妨推测的更多一点,既然服务关闭,规则就丢了,我们是不是可以直接将规则持久化?确实,Sentinel配置的规则,都是存放在内存里面的,这样的流控规则肯定不能满足生成环境的要求,所以我们要将这些规则持久化。
持久化流控规则的几种方式
- 文件配置(不建议使用)
- Nacos配置
- ZooKeeper配置
- Apollo配置
准备工作
启动Nacos和Sentinel Dashboard。还不知道是啥的,可以先按照下面链接学习一下
在原有的限流项目中添加Sentinel整合Nacos的依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.8.0</version>
</dependency>
添加对应的本地文件配置
在application.yml文件中添加对应的读取流控规则的配置
spring:
cloud:
sentinel:
datasource:
# 名字随意
ds:
nacos:
# nacos的访问地址,,根据上面准备工作中启动的实例配置
server-add: 192.168.22.71:8848
# nacos中存储规则的groupId
groupId: DEFAULT_GROUP
# nacos中存储规则的dataId
dataId: ${spring.application.name}-rules
# 用来定义存储的规则类型
rule-type: flow
data-type: json
在nacos添加对应的流控配置
[
{
"resource": "/test/test",
"limitApp": "default",
"grade": 1,
"count": 5,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
流控配置注解
- resource: 需要限流的接口路径
- limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
- grade: 限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制
- count: 限流阈值
- strategy: 调用关系限流策略
- controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)
- clusterMode: 是否为集群模式
到这里为止我们的准备工作都已经做好了,接下来我们可以测试了。测试之前,由于我们添加了很多配置,我们将nacos、sentinel和项目重启一遍,然后准备访问接口
测试
直接访问我们需要限流的接口:localhost:8080/test/test
重启项目,然后在访问,再看看这个规则是否存在!