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

525 阅读3分钟

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 在这里插入图片描述

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