nacos(SpringCloud)配置加載過程
nacos(SpringCloud)配置加載
要說nacos配置加載,首先說一下bootstrap配置文件加載。
眾所周知,Springboot由run方法啟動,這里就不展開講了,我們主要看下面的代碼,創(chuàng)建Spring容器之前先準(zhǔn)備環(huán)境

org.springframework.boot.SpringApplication#prepareEnvironment

首先會創(chuàng)建或獲取一個environment,然后加載一些系統(tǒng)配置(環(huán)境變量等)
接下來關(guān)鍵了,發(fā)布ApplicationEnvironmentPreparedEvent事件

監(jiān)聽器有很多,與此次有關(guān)的是
BootstrapApplicationListener(創(chuàng)建Spring容器和配置中心交互)ConfigFileApplicationListener(讀取配置文件加載到environment)
首先是BootstrapApplicationListener,如下,可知默認(rèn)配置名字bootstrap,接著會進(jìn)入bootstrapServiceContext方法創(chuàng)建Spring容器

org.springframework.cloud.bootstrap.BootstrapApplicationListener#bootstrapServiceContext


這里會重走run方法進(jìn)行容器的創(chuàng)建,兩個容器是不同的
springboot容器為AnnotationConfigServletWebServerApplicationContext,cloud為AnnotationConfigApplicationContext,由上面的內(nèi)容可知這里又會重走監(jiān)聽器,
BootstrapApplicationListener,不過會由于以下代碼返回

接下來我們看一下另一個重要的監(jiān)聽器ConfigFileApplicationListener

由上可知,這里主要調(diào)用EnvironmentPostProcessor的postProcessEnvironment進(jìn)行處理;我們主要看的還是
org.springframework.boot.context.config.ConfigFileApplicationListener#postProcessEnvironment

這里沒有展開,有興趣可以看源碼,我們主要看加載前后cloud 的environment的變化
加載前

加載后

可以看出主要就是多了bootstrap.yml配置。
接下來我們看boot的environment的變化
加載前

加載后

可以看出多了application.properties的配置
那么問題來了,cloud的配置(bootstrap.yml)是如何加載到boot中的呢
listener看完了,接下來就到Initializer了
而Initializer的調(diào)用時機(jī)就在org.springframework.boot.SpringApplication#prepareContext


這里我們也重點看兩個
AncestorInitializer
創(chuàng)建時機(jī),cloud的容器創(chuàng)建完成

initialize方法,添加了bootstrap.yml方法到boot 的environment中

另一個是PropertySourceBootstrapConfiguration
我們先來看一下它是如何引入的
在創(chuàng)建cloud 的容器時,會引入一個配置BootstrapImportSelectorConfiguration

又引入了BootstrapImportSelector

這里利用SPI加載了PropertySourceBootstrapConfiguration

接下來我們看看initialize方法

這里就是使用PropertySourceLocator.locate()方法加載配置,然后添加到environment。
比如NacosPropertySourceLocator
至此nacos(SpringCloud)配置加載完畢。
后續(xù)補(bǔ)充:naocs共享配置和擴(kuò)展配置
spring:
profiles:
active: dev
application:
name: alibaba-demo
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yaml
#共享配置
shared-configs:
- data-id: shard-test.yaml
group: SHARD_GROUP
refresh: true
#擴(kuò)展配置
extension-configs:
- data-id: ext-test.yaml
group: EXT_GROUP
refresh: true不管是shared-configs還是extension-configs,對應(yīng)的data-id都需要加上文件后綴,如.yaml
數(shù)組下標(biāo)越大的配置項優(yōu)先級越高
不同配置優(yōu)先級 默認(rèn)配置 > 擴(kuò)展配置 > 共享配置
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
mybatis主從表關(guān)聯(lián)查詢,返回對象帶有集合屬性解析
這篇文章主要介紹了mybatis主從表關(guān)聯(lián)查詢,返回對象帶有集合屬性解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
SpringBoot整合MybatisPlusGernerator實現(xiàn)逆向工程
在我們寫項目的時候,我們時常會因為需要創(chuàng)建很多的項目結(jié)構(gòu)而頭疼,本文主要介紹了SpringBoot整合MybatisPlusGernerator實現(xiàn)逆向工程,具有一定的參考價值,感興趣的可以了解一下2024-05-05
eclipse+myeclipse 環(huán)境配置方法
eclipse+myeclipse配置環(huán)境2009-07-07
Mybatis-plus如何查詢表中指定字段(不查詢?nèi)孔侄?
這篇文章主要介紹了Mybatis-plus如何查詢表中指定字段(不查詢?nèi)孔侄?,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07

