1.原始模式
如果不做任何修改,Dashboard 的推送规则方式是通过 API 将规则推送至客户端并直接更新到内存中。
这种做法的好处是简单,无依赖;坏处是应用重启规则就会消失,仅用于简单测试,不能用于生产环境。
2.拉模式
Pull 模式的数据源(如本地文件、RDBMS 等)一般是可写入的。使用时需要在客户端注册数据源:将对应的读数据源注册至对应的 RuleManager,将写数据源注册至 transport 的 WritableDataSourceRegistry 中。
基于本地文件拉模式的核心源码:
- Dashboard那边通过SentinelApiClient与微服务端进行通信
- 微服务端也采用了Reactor模式接收Dashboard的请求
- 单线程池executor处理连接,多线程池bizExecutor处理读写请求
- 业务处理通过SimpleHttpCommandCenter处理
- getRules请求通过FetchActiveRuleCommandHandler处理
- setRules请求通过ModifyRulesCommandHandler处理
- 写数据源为FileWritableDataSource(通过SPI机制加载FileDataSourceInit)
- 读数据源为FileRefreshDataSource,3s扫描一次监控配置文件是否变化,如果变化则更新到内存,也即FlowRuleMananger的flowRules中(sentinel-datasource-extension中有)
3.推模式
生产环境下一般更常用的是 push 模式的数据源。对于 push 模式的数据源,如远程配置中心(ZooKeeper, Nacos, Apollo等等),推送的操作不应由 Sentinel 客户端进行,而应该经控制台统一进行管理,直接进行推送,数据源仅负责获取配置中心推送的配置并更新到本地。因此推送规则正确做法应该是 配置中心控制台/Sentinel 控制台 → 配置中心 → Sentinel 数据源 → Sentinel,而不是经 Sentinel 数据源推送至配置中心。
3.1 基于Nacos配置中心控制台实现推送(相对于基于文件的拉模式差异较小)
核心源码:
- 读数据源NacosDataSource,由包springcloud-alibaba-sentinel-datasource提供的NacosDataSourceFactoryBean和sentinel-datasource-nacos包引入的NacosDataSource共同完成实现。
- 写数据源NacosWritableDataSource,由SPI机制加载InitFunc的NacosDataSourceInitFunc实现
3.2 基于Sentinel控制台实现推送
从 Sentinel 1.4.0 开始,Sentinel 控制台提供 DynamicRulePublisher 和 DynamicRuleProvider 接口用于实现应用维度的规则推送和拉取:
- DynamicRuleProvider<T>: 拉取规则
- DynamicRulePublisher<T>: 推送规则
核心源码:
- Dashboard的SentinelApiClient替换为FlowRuleNacosProvider和FlowRuleNacosPublisher,FlowRuleNacosProvider负责从远程配置中心拉取规则,FlowRuleNacosPublisher负责推送规则到远程配置中心
- 微服务端不再与Dashboard建立通信连接,而是通过读数据源NacosDataSource从Nacos config配置中心读取配置规则
- 配置中心配置规则有变化,会立马通知微服务端去重新拉取,拉取后会调用NacosDataSource的configListener#receiveConfigInfo()更新配置规则到FlowRuleManager的flowRules中