這幾天因為專案組把一個springboot的專案整合到微服務里,用到Nacos,就簡單的研究了一下。
涉及到當使用Nacos作為配置中心的時候,簡單整合參考demo發現一個問題。到取nacos的配置的時候對應的dataId的規則是這樣的:
${prefix}-${spring.profiles.active}.${file-extension}
prefix 默認為 spring.application.name 的值,也可以通過配置項 spring.cloud.nacos.config.prefix來配置。
spring.profiles.active 即為當前環境對應的 profile,詳情可以參考 Spring Boot檔案。 注意:當 spring.profiles.active 為空時,對應的連接符 - 也將不存在,dataId 的拼接格式變成 ${prefix}.${file-extension}
file-exetension 為配置內容的資料格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置。目前只支持 properties 和 yaml 型別。
具體到我的springboot測驗環境里,除了指定了nacos的bootstrap.yml,本地還有application.yml,application-dev.yml,application-test.yml這些并沒有刪去,只是把資訊都稍作修改放到配置中心里。
當我在bootstrap.yml里指定了spring.application.name為A,spring.cloud.nacos.config.file-extension為yaml時,也沒有寫spring.profiles.active,按上面的規則,去服務器找配置的對應dataId應該是A.yaml。
最后發覺對應dataId卻是B-test.yaml,當然沒拿到服務器上的配置。
而B是本地application-test.yml里的spring.application.name的值,并且application.yml指定是spring.profiles.active為test。
這個就讓我困惑了,我之前對這個并沒有什么研究。一直的認知是bootstrap的加載順序高于application的。我理想的效果應該是先按bootstrap里配置的注冊中心資訊去拿服務器的配置,拿不到時再按本地的application找對應的配置。
這個實際效果卻是,bootstrap和application-x同時配置有spring.application.name時,生效的是application-test.yml中的值。
后面我又測驗了一下,當在bootstrap.yml也指定spring.profiles.active為dev(application.yml仍舊是test)。后面結果是對應dataId是C-dev.yaml。C是application-dev.yml里的spring.application.name的值。
此處具體到spring.profiles.active上卻是bootstrap.yml的值。
只有當把application-dev.yml或application-test.yml里的spring.application.name的值都刪掉時,這個時候name才會是A。dataId也是A-dev.yml或A-test.yml
我后面這樣測驗了一下:
applicaiton.yml里指定spring.profiles.active的是test配置,對應的applicaiton-dev.yml和applicaiton-test的yml里的spring.application.name分別是M和N。bootstrap.yml的file-extension為yaml。
1.當bootstrap.yml里既不指定active也不寫name時。
最后dataId:N-test.yaml
2.當bootstrap.yml里name寫上C。
最后dataId:N-test.yaml
3.當bootstrap.yml里active寫上dev
最后dataId:M-dev.yaml
4.當bootstrap.yml里active寫上dev,name寫上F。
最后dataId:M-dev.yaml
5.當bootstrap.yml里active寫上dev,name寫上F。同時刪掉applicaiton-dev.yml里name的A的值
最后dataId:F-dev.yaml
似乎這個取配置的dataId,一般來說,先看bootstrap里有沒有寫spring.profiles.active,沒有的話就看application.xml里的spring.profiles.active指定,根據這個去找對應的-dev或-test的application檔案對應的spring.application.name。
然后按照如name-dev.yaml到配置中心去拿對應配置,這個配置確實會優先于本地配置生效。
這是什么順序
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/195424.html
標籤:Web 開發
下一篇:兩個JDK
