用Nacos实现Sentinel规则的持久化

使用 Nacos 实现 Sentinel 规则的持久化,通常采用推送模式(Push模式)。这种模式通过配置中心统一管理规则,客户端监听配置中心并实时更新,具备高实时性和一致性,是生产环境的推荐方案。

以下是实现 Sentinel 与 Nacos 规则持久化的完整步骤示例:

1. 客户端(微服务)配置

第一步:引入相关依赖

在你的微服务项目 pom.xml 中,除了基础的 Sentinel 依赖外,还需要引入 Nacos 数据源依赖:

xml 复制代码
<!-- Sentinel 数据源之 Nacos -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>

第二步:配置 application.yml

在配置文件中定义 Nacos 数据源,指定规则存储的位置和格式。以流控规则(flow)和熔断降级规则(degrade)为例:

yaml 复制代码
spring:
  cloud:
    sentinel:
      eager: true  # 立即初始化
      transport:
        dashboard: localhost:8080  # Sentinel控制台地址
      datasource:
        # 流控规则数据源
        flow:
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-flow-rules
            groupId: SENTINEL_GROUP
            rule-type: flow
            namespace: sentinel-rules  # 命名空间(可选)
        # 熔断降级规则数据源
        degrade:
          nacos:
            server-addr: localhost:8848
            dataId: ${spring.application.name}-degrade-rules
            groupId: SENTINEL_GROUP
            rule-type: degrade

2. Nacos 配置中心规则定义

在 Nacos 控制台的对应命名空间和分组下,新建配置文件(格式选择 JSON)。

流控规则(FlowRule)示例:

json 复制代码
[
  {
    "resource": "getUser",
    "limitApp": "default",
    "grade": 1,
    "count": 2,
    "strategy": 0,
    "controlBehavior": 0,
    "clusterMode": false
  }
]

参数说明: *resource** 为资源名;*grade* 为限流阈值类型(1为QPS);*count* 为限流阈值;*controlBehavior* 为流控效果(0为直接拒绝)。*

熔断降级规则(DegradeRule)示例:

json 复制代码
[
  {
    "resource": "/test/sentinel",
    "limitApp": "default",
    "grade": 0,
    "count": 1000,
    "timeWindow": 10,
    "minRequestAmount": 1,
    "statIntervalMs": 2500
  }
]

参数说明: *grade** 为熔断策略(0为慢调用比例);*count* 为临界值(如RT超过1000ms算慢调用);*timeWindow* 为熔断时长(秒)。*

3. Sentinel Dashboard 控制台改造(关键)

原生的 Sentinel Dashboard 默认将规则推送到客户端内存中,重启即失效。要实现控制台与 Nacos 的双向同步 ,需要对 sentinel-dashboard 源码进行改造:

  1. 拉取源码:从 GitHub 下载与你项目匹配的 Sentinel 源码(如 1.8.7 版本)。
  2. 修改 POM 依赖 :在 sentinel-dashboard 模块的 pom.xml 中,找到 sentinel-datasource-nacos 依赖,移除 <scope>test</scope>
  3. 复制 Nacos 支持类 :将 src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacos 包下的所有类,复制到 src/main/java 对应的包下。
  4. 修改 Nacos 配置 :在 NacosConfig.java 中配置你的 Nacos 地址(如 localhost:8848)。
  5. 修改 Controller :在 FlowControllerV2.java(或其他规则控制器)中,将注入的 Provider 和 Publisher 替换为 Nacos 的实现:
  6. 重新打包部署 :修改完成后,重新编译打包 sentinel-dashboard,并启动新的控制台。

4. 验证与测试

配置完成后,你可以通过编写简单的接口来验证规则是否生效:

java 复制代码
@GetMapping("/rules/status")
public Map<String, Object> checkRuleStatus() {
    List<FlowRule> flowRules = FlowRuleManager.getRules();
    List<DegradeRule> degradeRules = DegradeRuleManager.getRules();
    return Map.of(
        "flowRulesCount", flowRules.size(),
        "degradeRulesCount", degradeRules.size()
    );
}

此时,无论是在 Nacos 控制台修改规则,还是在改造后的 Sentinel Dashboard 中修改规则,微服务都能实时拉取并生效,且重启服务后规则依然保留。