0%

Sentinel规则持久化

Sentinel 规则持久化:基于 Nacos 实现配置永久生效

Sentinel 默认将规则存储在内存中,微服务重启后规则会丢失,需要重新配置。为解决这一问题,可将规则持久化到配置中心(如 Nacos),实现规则的持久化存储与动态同步。本文详细介绍如何基于 Nacos 实现 Sentinel 规则的持久化。

规则持久化的核心价值

在生产环境中,规则持久化至关重要:

  • 避免重复配置:微服务重启后无需手动重建规则;
  • 动态更新:通过 Nacos 修改规则后,所有微服务实例可实时感知;
  • 版本管理:Nacos 提供配置版本控制,便于追溯规则变更历史;
  • 高可用:配置中心集群部署,避免规则存储单点故障。

基于 Nacos 的持久化方案

Sentinel 支持多种持久化数据源(Nacos、Apollo、ZooKeeper 等),其中 Nacos 因其轻量、易用且与 Spring Cloud Alibaba 生态无缝集成,成为主流选择。

实现原理:

  1. 微服务启动时,从 Nacos 读取规则并加载到 Sentinel;
  2. 微服务运行时,Sentinel Dashboard 修改的规则会同步到 Nacos;
  3. Nacos 配置变更时,微服务自动感知并更新本地规则。

具体实现步骤

1. 引入依赖

在微服务的pom.xml中添加 Sentinel-Nacos 数据源依赖:

1
2
3
4
5
6
<!-- Sentinel 规则持久化到 Nacos -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<!-- 版本需与Sentinel核心版本匹配,如1.7.2 -->
</dependency>

该依赖提供了 Sentinel 与 Nacos 的连接逻辑,支持规则的读写与监听。

2. 配置 Nacos 数据源

application.yml中配置 Sentinel 的数据源为 Nacos,指定规则存储的 Nacos 地址、配置 ID 等信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
spring:
application:
name: springcloudalibaba-sentinel # 服务名,将作为Nacos配置的dataId
cloud:
sentinel:
transport:
dashboard: localhost:8080 # Sentinel控制台地址
port: 8719 # 客户端与控制台通信端口
datasource:
# 数据源名称(自定义,如ds1)
ds1:
nacos:
server-addr: localhost:8848 # Nacos服务地址
dataId: ${spring.application.name} # 配置ID(通常与服务名一致)
groupId: DEFAULT_GROUP # 配置分组(默认DEFAULT_GROUP)
data-type: json # 配置格式(JSON)
rule-type: flow # 规则类型(flow:流控规则)
nacos:
discovery:
server-addr: localhost:8848 # Nacos注册中心地址(与数据源地址一致)

配置说明

  • datasource.ds1ds1是自定义的数据源名称,可配置多个数据源(如ds2用于降级规则);
  • rule-type:指定规则类型,支持flow(流控)、degrade(降级)、param-flow(热点)、system(系统)、authority(黑白名单);
  • 若需持久化多种规则,需配置多个数据源(如ds1对应流控,ds2对应降级)。

3. 在 Nacos 中创建规则配置

登录 Nacos 控制台(http://localhost:8848/nacos),按以下步骤创建规则配置:

  1. 进入 “配置管理> 配置列表”,点击 “+” 新建配置;
  2. 填写配置信息:
    • Data ID:与application.ymldataId一致(如springcloudalibaba-sentinel);
    • GroupDEFAULT_GROUP(与配置文件一致);
    • 配置格式:JSON;
    • 配置内容:按规则类型的 JSON 格式定义(以流控规则为例):
1
2
3
4
5
6
7
8
9
10
11
[
{
"resource": "/testPersistence", // 资源名(接口路径或@SentinelResource定义的名称)
"limitApp": "default", // 调用来源(default表示不区分)
"grade": 1, // 阈值类型:1(QPS)、0(线程数)
"count": 1, // 阈值(如QPS=1)
"strategy": 0, // 流控模式:0(直接)、1(关联)、2(链路)
"controlBehavior": 0, // 流控效果:0(快速失败)、1(Warm Up)、2(排队等待)
"clusterMode": false // 是否集群模式(单机为false)
}
]
  1. 点击 “发布”,配置保存到 Nacos。

4. 验证持久化效果

  1. 启动微服务,Sentinel 会自动从 Nacos 加载规则;
  2. 访问 Sentinel Dashboard(http://localhost:8080),查看 “流控规则”,可看到 Nacos 中配置的规则已生效;
  3. 重启微服务,规则不会丢失(从 Nacos 重新加载);
  4. 在 Dashboard 中修改规则(如调整阈值为 2),修改会自动同步到 Nacos(查看 Nacos 配置可发现内容已更新)。

多规则类型的持久化配置

若需同时持久化流控、降级、热点等多种规则,需配置多个数据源,示例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
spring:
cloud:
sentinel:
datasource:
# 流控规则数据源
flow:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-flow # 流控规则的dataId
groupId: SENTINEL_GROUP
data-type: json
rule-type: flow
# 降级规则数据源
degrade:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-degrade # 降级规则的dataId
groupId: SENTINEL_GROUP
data-type: json
rule-type: degrade
# 热点规则数据源
param-flow:
nacos:
server-addr: localhost:8848
dataId: ${spring.application.name}-param-flow
groupId: SENTINEL_GROUP
data-type: json
rule-type: param-flow

对应 Nacos 中需创建三个配置(服务名-flow服务名-degrade服务名-param-flow),分别存储不同类型的规则。

各规则类型的 JSON 格式示例

1. 降级规则(degrade)
1
2
3
4
5
6
7
8
9
10
[
{
"resource": "/testDegrade", // 资源名
"grade": 1, // 降级策略:0(慢调用比例)、1(异常比例)、2(异常数)
"count": 0.5, // 阈值:异常比例为0.5(50%)
"timeWindow": 10, // 熔断时长(秒)
"minRequestAmount": 5, // 最小请求数(触发降级的最少请求数)
"statIntervalMs": 1000 // 统计时长(毫秒)
}
]
2. 热点规则(param-flow)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[
{
"resource": "/testHotParam", // 资源名
"count": 5, // 阈值
"grade": 1, // 阈值类型:1(QPS)
"paramIdx": 0, // 参数索引(第0个参数)
"paramFlowItemList": [ // 例外项
{
"object": "admin", // 参数值
"count": 20 // 例外项阈值
}
]
}
]

注意事项

  1. 版本一致性sentinel-datasource-nacos的版本需与 Sentinel 核心依赖(如seata-all)版本一致,避免兼容性问题;
  2. 权限控制:生产环境中需为 Nacos 配置权限,限制规则的修改权限;
  3. 配置分组:建议将 Sentinel 规则统一放在专用分组(如SENTINEL_GROUP),便于管理;
  4. 动态更新:Nacos 配置修改后,Sentinel 会在 1 秒内感知(默认刷新间隔),无需重启服务;
  5. 集群模式:若需多实例共享规则阈值,需开启clusterMode: true并配置集群规则。

总结

通过 Nacos 实现 Sentinel 规则持久化,解决了规则丢失问题,同时支持动态更新,是生产环境的必备配置。核心步骤包括:

  1. 引入nacos-datasource依赖;
  2. 配置多数据源(按规则类型);
  3. 在 Nacos 中定义规则 JSON;
  4. 验证规则的加载与同步

欢迎关注我的其它发布渠道

表情 | 预览
Powered By Valine
v1.3.10