sentinel-规则持久化

Author Avatar
丁起男 10月 26,2021
  • 在其它设备中阅读本文章

sentinel-规则持久化

sentinel为了便于限流规则持久化管理,专门提供了ReadableDataSource(配置读取)与WritableDataSource(配置写入)接口,利用这两个接口可以向指定的存储设备中实现规则的读写处理

sentinel提供的DataSource是一个逻辑上的概念,具体的存储可以是关系型数据库、文件、zookeeper、redis、nacos等终端,在终端中可以保存所需要的限流规则,而对于DataSource的操作形式也提供有两种:

  • 拉模式(Pull-Based):客户端主动向某个DataSource存储中心定期轮询并读取规则,这个配置中心可能是一个文件,或者是关系型数据库,虽然此种方式简单,但是却无法及时获取到配置更新
  • 推模式(Push-Based):所有的限流规则由配置中心(Nacos、zookeeper、redis等)统一推送,客户端通过注册监听器的方式监听规则的变化,这样可以更好的保持配置的实时性和一致性

使用nacos配置流控规则

  1. 在nacos下创建一个新的配置项,名为:服务名-flow-rules

内容:

[      限流配置项可以有多个,所以使用json数组来进行描述
  {    具体的限流规则
    "resource": "/test",   资源名称
    "limitApp": "default", 应用来源
    "grade": 1,            阈值类型  0根据线程数量   1根据qps
    "count": 1,            单机阈值定义
    "strategy": 0,         流控模式  0直接  1关联   2链路
    "controlBehavior": 0,  流控效果  0快速失败   1WarmUp   2队列
    "clusterMode": false   采用非集群模式
  }
]

具体的配置项可以在sentinel源码种的:Rule接口的实现中查找,比如流控规则就是FlowRule(别忘了AbstractRule里也有)的成员变量

  1. 添加依赖
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
    <version>1.5.2</version>
</dependency>
  1. 修改配置文件
spring:
  cloud:
      datasource:  #数据源配置
        flow-datasource: #流控数据源
          nacos: #当前存储介质nacos
            server-addr: 127.0.0.1:8848
            namespace: 71cb07c5-28f1-49da-b8ad-56a76ac9037a
            group-id: SENTINEL_GROUP
            data-id: ${spring.application.name}-flow-rules #配置项名称
            data-type: json #数据格式
            rule_type: flow #策略类型:流控

当nacos种的配置修改后,由于配置项允许自动刷新,会自动加载新的配置

使用nacos配置系统规则

  1. 在nacos中添加名为服务名-system-rules配置文件
[
    {
        "qps":1
    }
]
  1. 修改配置文件
spring:
  cloud:
    sentinel:
      datasource:  #数据源配置
        system-datasource: #系统规则数据源
          nacos: #当前存储介质nacos
            server-addr: 127.0.0.1:8848
            namespace: 71cb07c5-28f1-49da-b8ad-56a76ac9037a
            group-id: SENTINEL_GROUP
            data-id: ${spring.application.name}-system-rules #配置项名称
            data-type: json #文件结构
            rule_type: system #流控