)
文章目录Sentinel 规则持久化Nacos InitFunc流程概览一、引入依赖二、order-service 重写 InitFunc2.1 NacosDataSourceInit.java2.2 SPI 注册必须2.3 InitFunc 代码参数说明三、Nacos 控制台配置3.1 新建配置项3.2 配置内容 JSON 示例3.3 JSON 字段说明FlowRule四、重启服务验证五、单向传递参考官方文档Sentinel 规则持久化Nacos InitFunc基于spring-cloud-demo· order-service · Nacos 存规则重启不丢失流程概览① pom 引入 sentinel-datasource-nacos ② order-service 实现 InitFunc SPI 注册 ③ Nacos 控制台新建配置JSON ④ 重启 order-service → 加载规则Nacos 改 JSON 后客户端自动刷新一、引入依赖spring-cloud-starter-alibaba-sentinel不含Nacos 数据源须额外加!-- Sentinel 客户端 --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-sentinel/artifactId/dependency!-- 从 Nacos 读规则InitFunc 方式必需 --dependencygroupIdcom.alibaba.csp/groupIdartifactIdsentinel-datasource-nacos/artifactId/dependency二、order-service 重写 InitFunc2.1 NacosDataSourceInit.javapackagecom.emrys.order.config.datasource;importcom.alibaba.csp.sentinel.datasource.ReadableDataSource;importcom.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;importcom.alibaba.csp.sentinel.init.InitFunc;importcom.alibaba.csp.sentinel.slots.block.flow.FlowRule;importcom.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;importcom.alibaba.fastjson.JSON;importjava.util.List;publicclassNacosDataSourceInitimplementsInitFunc{Overridepublicvoidinit()throwsException{finalStringremoteAddress127.0.0.1:8848;// Nacos 地址 host:portfinalStringgroupIdSentinel:Demo;// 与 Nacos Group 一致finalStringdataIdcom.alibaba.csp.sentinel.demo.flow.rule;// 与 Nacos DataId 一致ReadableDataSourceString,ListFlowRuleflowRuleDataSourcenewNacosDataSource(remoteAddress,groupId,dataId,source-JSON.parseArray(source,FlowRule.class));// 配置内容为 JSON 数组FlowRuleManager.register2Property(flowRuleDataSource.getProperty());// 启动时从 Nacos 加载规则以后 Nacos 改 JSONProperty 变化 → FlowRuleManager 自动换规则不用重启。}}2.2 SPI 注册必须路径src/main/resources/META-INF/services/com.alibaba.csp.sentinel.init.InitFunc内容一行全限定类名com.emrys.order.config.datasource.NacosDataSourceInit无此文件init()不会执行。2.3 InitFunc 代码参数说明变量说明本示例值remoteAddressNacos 地址127.0.0.1:8848groupIdNacos 配置 GroupSentinel:DemodataIdNacos 配置 DataIdcom.alibaba.csp.sentinel.demo.flow.rule解析器配置体格式JSON.parseArray→JSON 数组三、Nacos 控制台配置登录 Nacos →配置管理→配置列表→新建配置。3.1 新建配置项字段填什么Data IDcom.alibaba.csp.sentinel.demo.flow.rule与 InitFunc 中dataId一致GroupSentinel:Demo与 InitFunc 中groupId一致配置格式JSONInitFunc 用parseArray解析勿选 YAML配置内容见下方 JSON 示例3.2 配置内容 JSON 示例空规则先验证连通[]流控示例限order-service-printQPS1[{resource:order-service-print,limitApp:default,grade:1,count:1,strategy:0,controlBehavior:0,clusterMode:false}]3.3 JSON 字段说明FlowRuleJSON 字段含义示例resource资源名与簇点链路一致order-service-print或/order/readlimitApp针对来源default表示不区分defaultgrade阈值类型0 并发线程数1 QPS1count单机阈值1strategy流控模式0 直接1 关联2 链路0controlBehavior流控效果0 快速失败1 预热2 排队0clusterMode是否集群模式false四、重启服务验证Nacos 发布上述 JSON 配置重启order-service连续访问/order/read两次资源经order-service-printQPS1 时第二次应被限流再次重启order-service限流仍生效 → 持久化成功Nacos 中修改 JSON 发布后客户端会通过 Nacos 监听自动刷新规则一般无需重启。五、单向传递上述持久化数据只能从Nacos传出,不能在DashBoard控制台传输到Nacos,要想双向传输,需要更改DashBoard的jar包内容.参考官方文档动态规则扩展 · Sentinel WikiSentinel 进阶指南 · 动态数据源