echo编辑整理



上文我们已经认识了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添加对应的流控配置

Spring Cloud Alibaba-Sentinel流控规则关闭服务就消失解决方案(使用nacos存储规则)_SpringCloud

[
{
"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​

Spring Cloud Alibaba-Sentinel流控规则关闭服务就消失解决方案(使用nacos存储规则)_持久化_02

重启项目,然后在访问,再看看这个规则是否存在!