Sentinel 整合 Nacos 实现动态规则配置的持久化和双向同步,主要步骤如下:
1. 添加依赖
在 Sentinel 相关项目中引入 Nacos 数据源依赖。
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
2. 配置 Nacos 数据源
在 Sentinel 的配置文件中(如 application.yml
或 application.properties
)添加 Nacos 数据源的相关配置信息,包括 Nacos 服务器地址、数据集 ID 等。
spring:
cloud:
sentinel:
datasource:
ds1:
nacos:
server-addr: localhost:8848 # Nacos 服务器地址
data-id: sentinel-rules # Nacos 中存储规则的数据集ID
group-id: DEFAULT_GROUP # Nacos 分组ID,默认为 DEFAULT_GROUP
namespace: public # Nacos命名空间(可选)
3. 持久化规则到 Nacos
通过 Sentinel 控制台或者其他方式设置的流量控制、熔断降级等规则会自动或者手动推送到 Nacos 中指定的数据集下。
4. 双向同步
-
从 Sentinel 到 Nacos:Sentinel 控制台添加或修改规则后,规则会被持久化到 Nacos。
-
从 Nacos 到 Sentinel:当 Nacos 中的规则发生变化时,Sentinel 通过监听 Nacos 的数据变更事件实现动态加载更新规则。这通常需要 Sentinel 内部已经实现了对 Nacos 数据源的支持,能够定期或实时拉取并应用规则。
为了实现完全的双向同步,可能需要定制 Sentinel 控制台或者扩展 Sentinel 的数据源管理逻辑,确保 Sentinel 控制台可以感知并同步 Nacos 上的手动更改。
示例代码(简化版)
对于自定义同步逻辑,你可能需要创建一个类来处理 Nacos 数据源的初始化和规则更新监听:
import com.alibaba.csp.sentinel.datasource.Converter;
import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import java.util.List;
public class SentinelNacosConfig {
// 创建 Nacos 数据源
public void initFlowRulesFromNacos(String serverAddr, String groupId, String dataId) {
Converter<String, List<FlowRule>> converter = source -> JSON.parseArray(source, FlowRule.class);
NacosDataSource<List<FlowRule>> flowRuleDataSource = new NacosDataSource<>(serverAddr, groupId, dataId, converter);
// 注册数据源到 FlowRuleManager
FlowRuleManager.register2Property(flowRuleDataSource.getProperty());
}
}
这样,在启动应用时调用该方法即可将 Nacos 中的流控规则加载至 Sentinel,并且由于 NacosDataSource 的设计,它会在后台定时刷新数据,从而实现实时同步。同时,Sentinel 控制台保存的规则也会被推送至 Nacos 中,形成双向同步的效果。