使用 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 源码进行改造:
- 拉取源码:从 GitHub 下载与你项目匹配的 Sentinel 源码(如 1.8.7 版本)。
- 修改 POM 依赖 :在
sentinel-dashboard模块的pom.xml中,找到sentinel-datasource-nacos依赖,移除<scope>test</scope>。 - 复制 Nacos 支持类 :将
src/test/java/com/alibaba/csp/sentinel/dashboard/rule/nacos包下的所有类,复制到src/main/java对应的包下。 - 修改 Nacos 配置 :在
NacosConfig.java中配置你的 Nacos 地址(如localhost:8848)。 - 修改 Controller :在
FlowControllerV2.java(或其他规则控制器)中,将注入的 Provider 和 Publisher 替换为 Nacos 的实现: - 重新打包部署 :修改完成后,重新编译打包
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 中修改规则,微服务都能实时拉取并生效,且重启服务后规则依然保留。