## sentinel规则持久化
生产环境上,一般都是通过动态规则持久化的方式来动态的管理限流规则,也就是说,很多时候流控规则都会存储在文件,数据库或者配置中心当中,Sentinel的DataSource接口给我们提供了对接任意配置源的能力。所谓的动态规则就是通过控制台配置规则后持久化到各个数据源中。
![](https://img.kancloud.cn/cf/e8/cfe8227514224d3140b4e4b19cfa24c3_1130x584.png)
## sentinel的两个DataSource接口
* ReadableDataSource:读数据源负责监听持久化的数据源的变更,在接收到变更事件时将最新的数据更新
* WritableDataSource:写数据源负责将变更后的规则写入到持久化的数据源中
## sentinel-extension模块分析
在 1.7.1 版本,sentinel-extension 模块下的子模块除 sentinel-parameter-flow-control、sentinel-annotation-aspectj 之外,其余子模块都是实现动态数据源的模块。
* sentinel-datasource-extension:定义动态数据源接口、提供抽象类
* sentinel-datasource-redis:基于 Redis 实现的动态数据源
* sentinel-datasource-zookeeper: 基于 ZooKeeper 实现的动态数据源
* 其它省略
sentinel-datasource-extension 模块是 Sentinel 实现动态数据源的核心。
### SentinelProperty
SentinelProperty 是 Sentinel 提供的一个接口,可注册到 Sentinel 提供的各种规则的 Manager,例如 FlowRuleManager,并且可以给 SentinelProperty 添加监听器,在配置改变时,你可以调用 SentinelProperty#updateValue 方法,由它负责调用监听器去更新规则,而不需要调用 FlowRuleManager#loadRules 方法。同时,你也可以注册额外的监听器,在配置改变时做些别的事情。
SentinelProperty 并非 sentinel-datasource-extension 模块中定义的接口,而是 sentinel-core 定义的接口,其源码如下:
~~~
public interface SentinelProperty {
void addListener(PropertyListener listener);
void removeListener(PropertyListener listener);
boolean updateValue(T newValue);
}
~~~
* addListener:添加监听器
* removeListener:移除监听器
* updateValue:通知所有监听器配置更新,参数 newValue 为新的配置
默认使用的实现类是 DynamicSentinelProperty,其实现源码如下:
~~~
public class DynamicSentinelProperty implements SentinelProperty {
// 存储注册的监听器
protected Set> listeners = Collec