Alibaba Nacos服务配置中心
2022-01-27 11:42:09 5 举报
Alibaba Nacos服务配置中心源码图
作者其他创作
大纲/内容
this.context.publishEvent(new RefreshScopeRefreshedEvent())
PropertySourceLocator#locateCollection
ConfigFactory.createConfigService(properties)
根据变化的dataid调用nacos server端获取最新配置,并更新本地快照
refreshEnvironment()
长轮询
轮询接口,长连接处理
排出除了SYSTEM.JNDI.SERVLET系统环境变量之外的所有变量
LocalConfigInfoProcessor.getFailover
更新配置,Spring Cloud的配置
loadNacosPropertySource
NacosContextRefresher
准备上下文
executorService.execute(new LongPollingRunnable(i))
readFile(localPath)
用户通过nacos-console后台管理页面修改了配置,点击了发布
run
allSubs.add(this)
NacosConfigProperties
loadApplicationConfiguration
ContextRefresher
响应配置发生变化的key
运行监听器
调用NacosConfig的构造器
implements
全量dump配置信息
NacosConfigService
allSubs.remove(ClientLongPolling.this)
优先使用本地配置
MetricsHttpAgent#httpGet
ConfigController#getConfig
NacosConfigAutoConfiguration
客户端工作类
nacosConfigManager.getConfigService()
addListener
LegacyContextRefresher#updateEnvironment()
ContextRefresher#refresh()
NotifyCenter.publishEvent(event)
handle((RefreshEvent) event)
如果未获取到配置信息则远程调用配置中心获取配置信息
NacosConfigManager
/nacos/v1/cs/configs
PropertiesPropertySourceLoader#load
将数据库中所有ConfigInfo查询出来写到服务器的磁盘中
ConfigServletInner#doGetConfig
persistService.findConfigMaxId()
加载顺序:1.${spring.application.name}(微服务名称)2.${spring.application.name}.文件扩展名3.${spring.application.name}.${profile}.文件扩展名优先级:3>2>1
加载nacos配置中心的配置信息
保存结果到本地文件
检查变更配置
NacosRefreshProperties
context.publishEvent(new ApplicationReadyEvent)
NacosConfigBootstrapConfiguration
Spring Boot应用启动
spring-cloud-context:3.0.4.jar!/META-INF/spring.factories
spring-cloud-alibaba-nacos-config:2.2.5.RELEASE.jar!/META-INF/spring.factories
两个线程池:1.只有一个线程的线程池,用来执行定时任务,每隔10ms执行一次checkConfigInfo()2.线程数等处理器个数的线程池,用来执行ClientWorker.LongPollingRunnable#run
YamlPropertySourceLoader#load
Header参数:Long-Pulling-Timeout:
ApplicationListener
从mysql数据库查询分页配置信息
ConfigCacheService.dump
准备环境信息
NacosPropertySourceLocator#locate
客户端
实际会调用
源码入口
发布RefreshEvent事件,监听器是RefreshEventListener
NacosRestTemplate#get
同步其它集群节点更新配置
AbstractSharedListener#innerReceive
当前MD5不致的,生成响应信息直接返回
prepareEnvironment
ConfigController#listener
配置中心配置类,对应bootstrap.properties中的配置信息
获取新的参数值,并和之前的参数进行比较找出改变的参数值
@PostConstruct
NacosRestTemplate#postForm
ConfigService
查询mysql,获取最大的主键量
dumpAllProcessor.process(new DumpAllTask())
PropertySourceLoader#load
触发ConfigDataChangeEvent事件
loadNacosData
发起远程调用其它集群节点
注册监听器
监听ApplicationReadyEvent事件,并注册一个nacoslistener用来监听nacos config配置修改后发布一个spring refreshEvent用来刷新配置和应用
MetricsHttpAgent#httpPost
获取配置中心服务ConfigService
正常插入
NotifyCenter.registerSubscriber
发布环境改变事件,参数值为改变的key
NacosConfigService(Properties properties)
处理ApplicationReadyEvent事件
checkConfigInfo()
longPollingService.addLongPollingClient
如果存在配置文件,读取配置文件信息
/nacos/v1/cs/configs/listener
listeners.running(context)
刷新容器
ConfigServletInner#doPollingConfig
ClientWorker.LongPollingRunnable
从队列中移除当前任务
是否刷新配置,默认true
向nacos server发送一个长连接(30s超时时间)返回nacos server有更新过的dataIds
发布应用准备事件 ApplicationReadyEvent
异常更新
ClientLongPolling clientSub = iter.next()
持久化到mysql
MetricsHttpAgent
addConfigFilesToEnvironment()
获取配置并且注册监听器
用来存储标记了@RefreshScope的注解的类的容器
Runnable#run()
PropertySourceLocator
Spring Boot提供的加载配置文件的接口
在Spring cloud context包中实现,通过SPI机制加载:SpringApplication在初始化的时候通过SpringFactoriesLoader加载ApplicationContextInitializer类型的实现类到initializers中
executeAsyncInvoke()
ApplicationContextInitializer#initialize
EventPublishingRunListener#running
用来向nacos server发起请求的代理
发起远程调用
发布配置
比较客户端的md5和server端的是否一致,不一致放到changeGroups里
applicationContext.publishEvent(new RefreshEvent())
subscriber.onEvent(event)
加载共享配置,对应spring.cloud.nacos.config.shared-configs
NacosRefreshHistory
注意:不是去查mysql,而是去查本地磁盘的缓存,所以直接修改mysql配置是不行的,修改配置需要发布ConfigDataChangeEvent事件,触发本地文件和内存的更新
dumpConfigInfo(dumpAllProcessor)
nacosPropertySourceBuilder.build
updateConfigInfo
ConfigExecutor.scheduleLongPolling
NacosConfigService#getConfigInner
registerNacosListenersForApplications()
ConfigFileApplicationListener.Loader#load()
将配置保存到磁盘文件中
写入到服务器磁盘
检查本地配置( check failover config)
无论配置有没有更新,最终都会响应,
clientSub.sendResponse(Arrays.asList(groupKey))
isRefreshEnabled()
DumpService#dumpOperate
ExternalStoragePersistServiceImpl.insertOrUpdate
用来触发刷新过程的对象
loadExtConfiguration(composite)
服务端push模式
删除配置
DumpService
ClientWorker
NacosPropertySourceLocator
从队列取任务执行
ConfigController#publishConfig
LocalConfigInfoProcessor.saveSnapshot
MD5Util.compareMd5
Naocs配置中心服务
删除监听器
AsyncNotifyService#run()
RefreshEventListener
为每个dataId注册监听器
延迟29.5s执行
LongPollingService#DataChangeTask#run()
ConfigExecutor.executeLongPolling
ConfigChangePublisher.notifyConfigChange(new ConfigDataChangeEvent())
RefreshScope
cacheMap中缓存着需要刷新的配置,将cacheMap中的数量以3000分一个组,分别创建一个LongPollingRunnable用来监听配置更新
DefaultPublisher#notifySubscriber
写入磁盘
cacheData.checkListenerMd5()
支持长轮询
响应到客户端
不支持长轮询
服务端
用于分页,每次取1000条配置刷进磁盘和内存
获取到配置文件
persistService.findAllConfigInfoFragment
refreshContext
LongPollingService#LongPollingService#onEvvent
extract(this.context.getEnvironment().getPropertySources())
removeConfig
缓存配置信息的MD5到内存中,并发布LocalDataChangeEventg事件
ExternalDumpService
处理RefreshEvent事件
SmartApplicationListener
persistService.insertOrUpdate
SpringApplicationBuilder.run()
SELECT max(id) FROM config_info
ClientLongPolling被提交给scheduler执行,可以拆分成4个步骤:1.创建—个调度的任务,调度的延时时间为29.5s⒉.将该ClientLongPolling自身的实例添加到一个allSubs中去3.延时时间到了之后,首先将该ClientLongPolling自身的实例从 allSubs 中移除4.获取服务端中保存的对应客户端请求的 groupKeys,检查是否发生变更,将结果写入response返回给客户端
sendResponse(changedGroups)
LongPollingService.ClientLongPolling#run()
Subscriber#onEvent
this.scope.refreshAll()
restTemplate.get
Nacos在启动时将所有配置文件信息Dump到磁盘上
handle((ApplicationReadyEvent) event)
listener.receiveConfigInfo(contentTmp)
SpringApplication.run()
PropertySourceBootstrapConfiguration#initialize
每隔10ms执行一次定时任务
java.lang.Runnable#run()
RefreshEventListener#onApplicationEvent
prepareContext
removeListener
addConfigInfo
DiskUtil.saveToDisk
checkLocalConfig(cacheData)
AsyncNotifyService
迭代allSubs队列
cache.md5 = md5;cache.lastModifiedTs = lastModifiedTs;NotifyCenter.publishEvent(new LocalDataChangeEvent(groupKey));
NacosPropertySourceLocator#loadNacosDataIfPresent
GenericScope#destroy()
获取本地配置文件路径
发布数据变更事件
服务端最多处理时长为29.5秒。留0.5秒返回给窗客户端,防止客户端读超时
super.destroy()
对有变化的配置,调用相应的监听器去处理
添加监听器
worker.getServerConfig
publishConfig
加载当前应用配置
loadSharedConfiguration(composite)
RefreshAutoConfiguration
直接与当前配置作比较,返回有更新的数据
清除Scope里的缓存,下次直接从BeanFactory获取一个新的实例
NacosConfigManager#createConfigService
把原来的environment里的参数放到一个新建的Spring Context容器下重新加载,之后关闭容器,这里就是获取参数的新值了
init()
CacheData#safeNotifyListener
MD5Util .compareMd5
onApplicationEvent(ApplicationReadyEvent event)
客户端pull长轮询,出现异常延迟2秒执行
持有NacosConfigProperties和ConfigService
如果MD5不相同,则更新CacheItem中的MD5属性和lastModifiedTs属性如果MD5不相同,还要发送通知告知数据有变更
收藏
收藏
0 条评论
回复 删除
下一页