Nacos配置中心
2022-12-02 17:49:57 0 举报
AI智能生成
Nacos配置中心
作者其他创作
大纲/内容
客户端拉取配置
读取Bootstrap.yml中的配置
通过springcloud包中的BootstrapApplicationListener实现,它响应ApplicationEnvironmentPreparedEvent事件,而该事件是在命令行、系统环境变量、java系统变量PropertySource加载进Environment后触发的,以便根据确定bootstrap.yml文件名称和位置
创建bootstrap SpingApplication,它的spring.config.name=bootstrap,将bootstrap.yml作为它的配置文件加载到它创建的bootstrap context的env中
根据bootstrap的配置拉取配置
bootstrap SpingApplication的primarySource是BootstrapImportSelectorConfiguration,它读取spring.factories中org.springframework.cloud.bootstrap.BootstrapConfiguration,其中包含NacosPropertySourceLocator和PropertySourceBootstrapConfiguration
向子SpringApplication添加了ApplicationInitializer: PropertySourceBootstrapConfiguration
bootstrap Context是父容器
子SpringApplication创建spring容器后,执行PropertySourceBootstrapConfiguration.initialize,它执行NacosPropertySourceLocator.loacate,根据dataid,group,namespace先从本地故障转移文件读取配置,如果没有,再调用ConfigService.getConfig()从配置中心拉取配置,保存到本地快照文件,用于配置中心不可用时读取
故障转移文件是手动创建的,快照文件每次拉取到配置后自动生成
PropertySourceLocator拉取到配置后,根据文件后缀,使用PropertySourceLoader将配置解析成PropertySource,添加到env
默认生成的dataid:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
配置优先级:默认生成的带profile和后缀名的dataid>带后缀名的dataid>dataid>extension>shared
服务端发布配置
更新表
配置信息config_info表、配置信息和标签关联表config_tags_relation、配置历史记录表his_config_info
更新本地缓存文件
默认全量更新,根据最大id 分页查询,将查到的每条配置内容的MD5值与本地缓存MD5比较,不同的进行更新
服务端获取配置
不会查询数据库表,而是直接读本地缓存文件
客户端监听配置
容器刷新之后,会执行ConfigService.addListener为每个dataId添加监听器,并定时向服务端发送配置是否变更的请求,服务端根据请求中配置的MD5判断配置是否变更
如果变更,全量拉取所有配置,每个dataId对应一个PropertySource,再和env中的PropertySource比对,dataId相同的覆盖,不同的新增,env更新后,对于没有加@RefreshScope的bean和加了@RefreshScope的有不同的刷新逻辑
没有加@RefreshScope的bean
直接执行它们的销毁方法,然后重新初始化
@ConfiguarationProperties的初始化会重新绑定env
加了@RefreshScope的
由Scope实现类RefreshScope管理,暴露给外部的是一个代理类,每个方法执行前会先获取beanName对应的读锁,然后再到从缓存中获取bean(如不存在则创建)
刷新时,会先获取beanName对应的写锁,再执行销毁方法,最后置空bean,下一次使用该bean时,会重新创建bean
0 条评论
下一页