Spring cloud bootstrap context機制

Bootstrap Application Context

Spring cloud程序在啓動階段,如果開啓了bootstrap啓動過程,則啓動時首先會創建一個bootstrap context,這個容器是項目主容器的父容器,它們共享一個Environment對象。

Bootstrap Context的主要目的是可以提前加載通過外部化配置中心維護的配置。

開啓bootstrap啓動過程需要引入“spring-cloud-starter-bootstrap”模塊,或者開啓屬性spring.cloud.bootstrap.enaled=true,這個屬性只能通過JVM系統屬性或者OS環境變量形式給出。

配置bootstrap context容器

boostrap context容器通過“bootstrap.properties(或者bootstrap.yml)”文件配置,而 “application.properties(或者application.yml)”是配置程序主容器的,兩者的配置分開。

類似Spring boot中的spring.config.*配置,也可以通過spring.cloud.bootstrap.namespring.cloud.bootstrap.location以及spring.cloud.bootstrap.additional-location 三個配置自己指定配置文件對bootstrap容器進行配置。

屬性優先級

由於bootstrap容器會作爲程序主容器的父容器,主容器會繼承bootstrap容器中的屬性,因此主容器額外獲得的屬性有兩部分:

  • bootstrap階段加載的屬性(可以稱爲bootstrap屬性,但注意並不是bootstrap.properties中的屬性,來源於遠程外部化配置)。
  • bootstrap.yml中配置的屬性。

主容器還有本地程序級配置屬性application.yml,對於主容器來說,屬性的優先級是:

  1. bootstrap屬性優先級最高,不會被本地屬性覆蓋。
  2. bootstrap.yml貢獻的屬性優先級最低,可以作爲默認配置。

通過PropertySourceLocator自定義bootstrap屬性來源

PropertySourceLocator組件用於Spring cloud bootstrap啓動階段加載外部化配置源。

Spring cloud bootstrap啓動階段默認以連接Spring cloud config server遠程配置服務器爲準,Spring cloud 也支持加載其它來源的屬性,我們只需要在bootstrap context中添加一個自己實現的PropertySourceLocator即可。

PropertySourceLocator組件的自動裝配機制仍然是“spring.factory”,配置在org.springframework.cloud.bootstrap.BootstrapConfiguration 節點下面,下面是nacos配置服務實現的示例:

org.springframework.cloud.bootstrap.BootstrapConfiguration=\
com.alibaba.cloud.nacos.NacosConfigBootstrapConfiguration

Bootstrap context啓動過程原理

(1)SpringApplication啓動的prepareEnvironment階段,Environment對象第一次創建後會發佈 ApplicationEnvironmentPreparedEvent事件,spring-cloud-context模塊中的BootstrapApplicationListener 負責監聽處理此事件,進而執行創建bootstrap context過程。

(2)SpringApplication啓動的prepareContext階段,會調用SpringApplication中管理的所有 ApplicationContextInitializer,其中一個是PropertySourceBootstrapConfiguration, 這個組件就是用來裝配PropertySourceLocator的,它裏面維護一個PropertySourceLocator列表, 就這樣在回調其initialize方法時,所有的PropertySourceLocator就會獲得執行機會加載外部屬性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章