基于Nacos限流规则持久化Demo

808 阅读3分钟

Sentinel默认限流规则是存储在内存中,只要服务器重启,对应的限流规则就会相应的消失,实际生产中肯定不允许这种操作,因此限流规则的持久化迫在眉睫。

Sentinel官方文档提供拉两种持久化模式,分别如下

但是官方更推荐Push模式。

用Nacos配置中心作为规则持久化。

官方架构图如下:

\

Nacos规则持久化Demo

实验准备:

  1. Sentinel DashBoard(源码)
  2. Nacos DashBoard(jar包即可)
  1. 微服务一个或多个

实验重点说明:

  1. 使用sentinel-datasource-nacos依赖
  2. 改造Sentinel DashBoard
    1. 改造时注意NacosUtil的文件名修改
      1. 默认有组,前缀等,应该和微服务dataId对应
      2. NacosConfig中localHost对应nacos的地址端口进行修改
  1. yml的配置

实验步骤:

1. 创建一个微服务

\

POM文件:

<dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

yaml文件

server:
  port: 9008
spring:
  application:
    ## 指定服务名称,在nacos中的名字
    name: sentinel-service
  cloud:
    nacos:
      discovery:
        # nacos的服务地址,nacos-server中IP地址:端口号
        server-addr: 127.0.0.1:8848
    sentinel:
      transport:
        ## 指定控制台的地址,默认端口8080
        dashboard: localhost:8080
      ## nacos持久化配置
      datasource:
        ## 配置流控规则,名字任意
        ds-flow:
          nacos:
            ## nacos的地址
            server-addr: 127.0.0.1:8848
            ## 配置ID
            dataId: ${spring.application.name}
            ## 配置分组,默认是DEFAULT_GROUP
            groupId: DEFAULT_GROUP
            ## 配置存储的格式
            data-type: json
            ## rule-type设置对应得规则类型,总共七大类型,在com.alibaba.cloud.sentinel.datasource.RuleType这个枚举类中有体现
            rule-type: flow
management:
  endpoints:
    web:
      exposure:
        ## yml文件中存在特殊字符,必须用单引号包含,否则启动报错
        include: '*'

\

接口

@RestController
@RequestMapping("/sentinel")
public class FlowLimitController {

    @GetMapping("/test")
    public String test(){
        return "接收到一条消息--------";
    }
}

其他步骤请自行创建

启动微服务


2.启动Nacos

打开nacos

3.改造Sentinel DashBoard

\

3.1 修改pom.xml

找到

<!-- for Nacos rule publisher sample -->
  <dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <scope>test</scope>
  </dependency>

将 test 这一行注释掉,即改为如下:

<!-- for Nacos rule publisher sample -->
<dependency>
  <groupId>com.alibaba.csp</groupId>
  <artifactId>sentinel-datasource-nacos</artifactId>
  <!--<scope>test</scope>-->
</dependency>

3.2

找到 sentinel-dashboard/src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacos目录,将整个目录拷贝到 sentinel-dashboard/src/main/java/com/alibaba/csp/sentinel/dashboard/rule/nacos

\

3.3 将FlowControllerV2中的代码复制到FlowControllerV1中

com.alibaba.csp.sentinel.dashboard.controller.v2.FlowControllerV2这个是sentinel提供的demo,

只需要将其中的代码全部覆盖到com.alibaba.csp.sentinel.dashboard.controller.FlowControllerV1中。

3.4 修改FlowControllweV1中的代码

  • 修改RequestMapping中的请求url为/v1/flow
  • 修改ruleProvider、rulePublisher的依赖,修改后的代码如下:
 	@Autowired
    //使用nacos的依赖
    @Qualifier("flowRuleNacosProvider")
    private DynamicRuleProvider<List<FlowRuleEntity>> ruleProvider;
    @Autowired
    //使用nacos的依赖
    @Qualifier("flowRuleNacosPublisher")
    private DynamicRulePublisher<List<FlowRuleEntity>> rulePublisher;

3.5 修改nacos相关配置

com.alibaba.csp.sentinel.dashboard.rule.nacos.NacosConfigUtil配置项必须与yaml中的对应,必须一致

包括:

  1. GROUP_ID(组名)
  2. FLOW_DATA_ID_POSTFIX(限空后缀)
  1. ...

\

com.alibaba.csp.sentinel.dashboard.rule.nacos.NacosConfig

这个类中有个方法如下图:

映射到Nacos的ip+port

启动Sentinal DashBoard

mvn clean install -DskipTests=true -pl sentinel-dashboard -am

\

4.实验测试环节

上面三部检查好实验就做好了一半。

记住约定>配置>编码

正式开始实验测试

\

  • 测试1: Sentinel推Nacos
  • 测试2:Nacos导入推Sentinel
  • 测试3:微服务接口限流

\

4.1多次首先访问(并没有限流)

\

4.2 Sentinel配置快速失败限流规则

配置好规则就推到Nacos中了。

再测试下微服务流控规则是否生效

4.3 从Nacos中配置规则

删除4.2中Nacos配置,会发现Sentinel DashBoard中限流规则已经删除,这时可以证明Nacos推Sentinel中是成功的。

再实验下接口限流规则是否删除。

实验证明接口限流已经删除。

再做Nacos中的配置

[{"app":"sentinel-service","clusterConfig":{"acquireRefuseStrategy":0,"clientOfflineTime":2000,"fallbackToLocalWhenFail":true,"resourceTimeout":2000,"resourceTimeoutStrategy":0,"sampleCount":10,"strategy":0,"thresholdType":0,"windowIntervalMs":1000},"clusterMode":false,"controlBehavior":0,"count":1.0,"gmtCreate":1640508090115,"gmtModified":1640508090115,"grade":1,"id":27,"ip":"10.0.217.204","limitApp":"default","port":8719,"resource":"/sentinel/test","strategy":0}]

Nacos配置时要配对....

微服务调用接口-->限流!!!!

终于成功了!!!

总结

对限流规则做持久化,可自行配置降级规则,热点参数规则等持久化....