当前位置: 首页>后端>正文

Sentinel规则持久化

Sentinel规则持久化,第1张

1.原始模式

如果不做任何修改,Dashboard 的推送规则方式是通过 API 将规则推送至客户端并直接更新到内存中。

这种做法的好处是简单,无依赖;坏处是应用重启规则就会消失,仅用于简单测试,不能用于生产环境

2.拉模式

Pull 模式的数据源(如本地文件、RDBMS 等)一般是可写入的。使用时需要在客户端注册数据源:将对应的读数据源注册至对应的 RuleManager,将写数据源注册至 transport 的 WritableDataSourceRegistry 中。

Sentinel规则持久化,第2张

基于本地文件拉模式的核心源码:

  • 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 数据源推送至配置中心。

Sentinel规则持久化,第3张

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中

https://www.xamrdz.com/backend/3gp1940367.html

相关文章: