sentinel的三种持久化模式源码剖析
2022-02-23 23:38:31 1 举报
sentinel的三种持久化模式源码剖析 原生模式,pull模式和push模式 以及列出可拓展点
作者其他创作
大纲/内容
RequestOriginParser
查看流控规则列表
6、存储文件发生变化更,就会触发监控逻辑,将变更的配置更新到内存中
implements
repository.save(entity);
Env
为dataId 添加监听器
FetchActiveRuleCommandHandler#handle
Converter
流控规则
将从nacos配置中心拉取
解析资源的请求来源origin
授权规则的拓展点 : 来源访问控制根据资源的请求来源(origin)限制资源是否通过
this.serverSocket.accept()
Sentinel Dashboard发起GET请求http://192.168.3.1:8720/getRules?type=flow
4、更新rules
InMemoryRuleRepositoryAdapter
1、用户通过Nacos配置中心控制台添加规则
通过SPI机制获取到CommandCenter 对象
parseOrigin(sRequest)
WritableDataSource
webContextUnify 为true
规则缓存
循环解析initFunc,并封装成OrderWrapper对象,且排序
configService.publishConfig
获取所有的流控规则
FlowRuleNacosPublisher#publish
spiLoader 通过SPI机制获取到所有的CommandHandler实例,并保存到Map中。通过CommandMapping注解指定key名称,CommandHandler作为value
FlowRuleNacosProvider#getRules
AutoRefreshDataSource
改造sentinel deshboard将规则直接发布到配置中心
sentinel-datasource-extension.jar 实现了
Sentinel Client 监听端口
2.推送规则
判断是否为资源添加http method作为前缀,比如{GET:/user/findOrderByUserId/1}
pring-cloud-alibaba-sentinel-datasource.2.1.1.RELEASE.jar
清除内存中的规则
注册handler
3.配置中心配置文件发生变更监听器就会执行回调方法,更新配置规则到内存
PropertyListener
parser.convert(conf);
NacosDataSourceFactoryBean#getObject
SentinelDataSourceHandler#afterSingletonsInstantiated
找到对应的事件处理器
可读数据源注册到 FlowRuleManager当规则文件发生变化时,就会更新规则内存
FlowRuleManager.loadRules(flowRules);
w.func.init();
DynamicRuleProvider
ReadableDataSource
listener.configUpdate(newValue);
微服务接入Sentinel Dashboard控制台启动
注册BeanNacosDataSourceFactoryBean
RequestOriginParser originParser = WebCallbackManager.getRequestOriginParser();
InMemoryRuleRepositoryAdapter<FlowRuleEntity>
第一次调用,Env初初始化阶段执行静态代码块
currentProperty.removeListener(LISTENER); property.addListener(LISTENER); currentProperty = property;
当文件或配置规则发生变更时回调此方法
通信模块
获得nacos配置中心服务
CommandCenterProvider.getCommandCenter()
1、创建了一个CPU线程大小的固定线程池,用来做业务线程池 * 2、开启服务线程创建Server Socket绑定端口,默认为8719 * 3、实时监听sentinel-dashboard发送的请求
解析配置
String type = request.getParam(\"type\"); // rule data in get parameter String data = request.getParam(\"data\");
定时任务,一个线程,3s周期
allRules.clear(); machineRules.clear(); appRules.clear();
extends
开启服务线程
写入数据源
将可写数据源注册至transport模块的WritableDataSourceRegistry中,这样收到控制台推送的规则时,Sentinel会先更新到内存,然后将规则写入文件中
publishRules
发送到客户端发布规则
利用FactoryBean拿到相对应规则的NacosDataSource 对象
registerCommands(handlers)
写数据源接口
Listener#receiveConfigInfo
\"flow\".equalsIgnoreCase(type)
serverInitTask#run
解析请求,获取/findOrderByUserId/1作为资源名
2、推送规则
如果dataSource不为空
保存到内存上
getProperty().updateValue(newValue);
RequestOriginParser 的实现类需要交给WebCallbackManager管理才生效
新增规则/v1/flow/rule请求参数为FlowRuleEntity
RuleManager
接收请求
创建监听器
Sentinel Dashboard
sentinel dataSource
String commandName = HttpCommandUtils.getTarget(request);
FlowControllerV1#apiAddFlowRule
机器3
SpiLoader.of(InitFunc.class).loadInstanceListSorted();
SentinelProperty
更新内存
flowRules = rules;
initNacosListener();
this.configService = NacosFactory.createConfigService(this.properties);
解析控制台sentinel Dashboard发过来的请求 获取请求的命令
机器1
发送post请求/setRule?type=flow请求参数为FlowRule
发布到nacos配置中心
sentinel-dashboard
T newValue = loadConfig();
FlowPropertyListener#configUpdate
SentinelAutoConfiguration#sentinelDataSourceHandler
AbstractDataSource
FactoryBean
1、用户通过控制台添加规则
Spring cloud 集成sentinel 的pull模式
DefaultUrlCleaner 实现
WebCallbackManager.getRequestOriginParser()
保存在内存中存储了三个MAP:allRules,machineRules,appRules
while (true) 死循环
创建资源上下文
初始化AutoRefreshDataSource拓展自动更新内存
加载SentinelDataSourceHandler Bean
微服务A
保留所有的流控规则
HttpEventTask#run
CommonFilter#doFilter
1、用户通过Sentinel控制台添加规则
CommandHandler<?> commandHandler = SimpleHttpCommandCenter.getHandler(commandName);
configService.getConfig
5、用户修改本地规则存储文件
初始化nacos监听器,与之绑定
初始化CommandCenterInitFunc
Thread(serverInitTask).start()
从本地读取流控规则文件FlowRule.json
startTimerService();
创建流控规则写数据源FileWritableDataSource
Sentinel 的Push模式
写入相对应的数据源
3、更新到内存中
创建NacosDataSource对象
先拿出所有的流控规则
/v1/flow/rules
注册dataSource的property到FlowRuleManager里
InitExecutor.doInit()
commandCenter.start();
getProperty().updateValue(newValue);
FLOW_RULE_TYPE.equalsIgnoreCase(type)
this.configListener = new Listener()
FlowRuleManager.register2Property(dataSource.getProperty());
准备环境
异常逻辑,BlockException的处理
FlowRuleManager.getRules()
FlowRuleManager.register2Property(ds.getProperty());
CommandHandlerProvider.getInstance().namedHandlers()
SimpleHttpCommandCenter.ServerThread#run
加载或者更新配置
dataSource.write(value);
T newValue = NacosDataSource.this.parser.convert(configInfo);
流控规则监听器
规则被修改过
用新规则替代旧规则并通知所有的属性监听器回调configUpdate前提是 新值!=旧值
初始化所有非懒加载bean调用
解析返回
http://localhost:8052/findOrderByUserId/1
CommandCenterInitFunc#init
AbstractDataSource newDataSource = (AbstractDataSource) this.beanFactory\t\t\t\t.getBean(dataSourceName);
dataSourceProperties.postRegister(newDataSource);
异步发送,进行通信
4、将规则更新到本地文件,需要实现WritableDataSource
从nacos上获取dataId的数据
loadInitialConfig();
SPI 加载所有实现InitFunc的接口 拓展点可以实现拉模式的读写数据源的配置
setRule设置规则
UrlCleaner
DynamicSentinelProperty#updateValue
微服务启动
创建流控规则读数据源FileRefreshableDataSource需要文件的路径和名称
循环执行initList的init方法
当dataId的规则发生变更时回调
FileDataSourceInit#init
本地规则存储文件
WritableDataSourceRegistry.registerFlowDataSource(wds);
给DynamicSentinelProperty 绑定FlowPropertyListener
注册所有的CommandHandler到SimpleHttpCommandCenter的hashMap中
RuleRepository
FileRefreshableDataSource#readSource
target = urlCleaner.clean(target);
!isModified()
SimpleHttpCommandCenter
先初始化AbstractDataSource赋予解析器和SentinelProperty 对象
ModifyRulesCommandHandler#handle
机器2
socket线程执行
利用InitFun拓展实现FileDataSourceInit 初始化逻辑:当用户访问sentinel资源时,会初始化此模块,从本地文件加载sentinel规则。当文件配置发生变更时,利用读数据源监听规则的变化,将配置更新到内存当sentinel控制台推送规则时,利用写数据源将配置更新到规则文件
DynamicRulePublisher
repository.saveAll(rules);
用来和控制台交互的处理逻辑
持久化到本地
commandCenter.beforeStart()
是流控规则
存储了三个MAP * allRules :根据ID来存 * machineRules :根据机器的APP,IP来存 * appRules :根据机器的名称来存
loadConfig(readSource())
CommandHandler
Spring cloud 集成sentinel 的push模式
this.parser = parser;//解析器 //用来更新配置变更的 this.property = new DynamicSentinelProperty<T>();
flowDataSource = datasource;
更新规则内存
getRules获取规则
返回流控规则列表
save(rule)
executor.submit(new ServerThread(serverSocket));
实现
改造Sentinel Deshboard将从配置中心拉取
注意:需要sentinel-web-servle.jar 提供,微服务没有引入该依赖,不会经过CommonFilter
修改规则
Nacos Dashboard
SmartInitializingSingleton
FileWritableDataSource#write
FlowControllerV1#apiQueryMachineRules
getServerSocketFromBasePort(port);
sentinel 的pull 模式
持久化的关键在于WritableDataSourceRegistry#getFlowDataSource是否拿到数据源可以通过WritableDataSourceRegistry#registerFlowDataSource注册上去
sentinel核心资源保护逻辑
httpMethodSpecify 默认为false
创建ServerSocket并绑定端口端口会从8719开始,如果占用+1
获得规则的类型和数据
0 条评论
下一页