application.yaml與bootstrap.yaml的使用
application.yaml與bootstrap.yaml
你對這兩個文件有沒有清晰認識?
application.yaml
- 用途:主要用于應用程序的主要配置,包括數(shù)據(jù)庫連接信息、端口號、日志級別、自定義屬性等應用級別的設置。這是Spring Boot應用中最常見的配置文件,幾乎所有自定義配置都會放在這里。
- 加載時機:
application.yaml
在Spring應用上下文初始化之后被加載,這意味著大部分Bean的創(chuàng)建和自動配置都會考慮到這里的配置信息。 - 覆蓋:可以通過命令行參數(shù)、環(huán)境變量、Java系統(tǒng)屬性等方式覆蓋
application.yaml
中的配置。
bootstrap.yaml
- 用途:主要用于應用程序的引導階段配置,特別是與Spring Cloud相關的配置,如配置中心(Config Server)的地址。它的內(nèi)容在應用程序的上下文初始化之前被加載,適合配置那些需要在Spring應用上下文啟動之前就需要讀取的屬性,比如用來配置從何處加載主配置文件的地址。
- 加載時機:
bootstrap.yaml
文件比application.yaml
更早加載,它在應用程序的引導階段就被處理,用于應用程序上下文初始化之前的配置,比如配置中心的配置。 - 用途示例:當使用Spring Cloud Config Server來集中管理配置時,你需要在
bootstrap.yaml
中配置Config Server的地址,這樣Spring Cloud會先從Config Server獲取配置信息,再初始化Spring Boot應用。
這兩大段在講什么 不能簡單講一下嗎?
知識儲備
- Bean:實現(xiàn)控制反轉的一個java對象 加入到ioc容器當中
- Spring上下文:Bean管理 資源訪問 消息傳遞 生命周期管理 我就簡單講一下第一個【第一個最好講】 Bean管理 : ApplicationContext 讀取配置元數(shù)據(jù)(xml文件 java配置 注解 )根據(jù)這些數(shù)據(jù)創(chuàng)建Bean 實現(xiàn)控制反轉
Spring上下文啟動:加載配置 -》 bean讀取 -》 bean的實例化 -》 bean的初始化 -》 啟動后監(jiān)聽
容器初始化階段(加載配置階段) springboot 會讀取 application.yaml 文件
bootstrap.yaml 文件在加載配置階段前 就已經(jīng)讀取了
bootstrap.yaml
更早加載,主要用于引導配置,影響整個應用的初始化;而 application.yaml
加載較晚,負責應用的主體配置,靈活性和可覆蓋性更高。
我們來舉例
bootstrap
配置文件在Spring Boot應用的啟動過程中比application
配置文件具有更高的優(yōu)先級。
這意味著在應用初始化的最早階段,Spring會先讀取bootstrap
文件中的配置。
由于Nacos作為配置中心,負責提供應用運行時所需的配置信息,將其地址放在bootstrap
中可以確保應用在加載其他任何配置或初始化Bean之前就能建立起與Nacos的連接,從而能夠及時獲取到所有必需的配置。
server: port: 3000 # 前端默認訪問端口號為3000 servlet: context-path: / # 前端默認訪問的根路徑 spring: application: name: gateway-service # 程序名就是服務名 cloud: nacos: server-addr: 174.148.4.170:8848 #注冊中心
當然還有其他原因:
- 功能隔離:
bootstrap
配置主要用于應用程序的引導階段,它配置的內(nèi)容是用來引導Spring Boot應用上下文的創(chuàng)建,比如配置中心的地址、安全證書、加密解密的密鑰等基礎設施級別的設置。而application
配置則是關于應用本身的業(yè)務邏輯和特性配置。將Nacos地址這樣的基礎設施配置與業(yè)務邏輯配置分離開來,有助于清晰地組織配置,同時也便于管理和維護。 - 安全性與穩(wěn)定性:將與配置中心通信的敏感信息和基礎配置放在
bootstrap
中,可以減少這些關鍵信息被不當覆蓋的風險,因為bootstrap
的配置不容易被外部環(huán)境變量或其他配置源所覆蓋。這對于生產(chǎn)環(huán)境尤其重要,保證了系統(tǒng)的穩(wěn)定性和安全性。 - 避免循環(huán)依賴:如果Nacos配置包含了應用運行所必需的參數(shù)(比如數(shù)據(jù)庫連接字符串),而這些參數(shù)又存儲在Nacos中,那么必須在應用啟動時就正確設置Nacos的地址以獲取這些參數(shù),避免因配置加載順序?qū)е碌臐撛谘h(huán)依賴問題
在來看一下3: 想象一下,你的Spring Boot應用需要從Nacos獲取數(shù)據(jù)庫連接字符串等關鍵配置來初始化數(shù)據(jù)庫訪問組件(如DataSource)。然而,這些數(shù)據(jù)庫連接信息實際上是存儲在Nacos中的。
這就形成了一個邏輯上的依賴鏈:應用啟動 -> 連接Nacos -> 獲取數(shù)據(jù)庫配置 -> 初始化數(shù)據(jù)庫連接。如果Nacos的地址或者連接Nacos所需的其他關鍵參數(shù)(如認證信息)也打算通過Nacos來管理,那么就會出現(xiàn)問題,因為這時應用在沒有Nacos配置的情況下無法知道如何連接到Nacos以獲取這些配置信息,形成了一種“雞生蛋,蛋生雞”的困境,即循環(huán)依賴。
總結
看到這你應該清楚了 哪些應該寫在bootstrap.yaml 哪些應該寫在application.yaml 里面
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解決
原來win10電腦上安裝的是jdk8的版本,因某些原因,現(xiàn)在想換成jdk7的版本,修改環(huán)境變量后,在cmd中執(zhí)行 [java -version]命令,顯示的是7的版本,遇到這樣的問題如何解決呢?下面小編給大家分享IntelliJ IDEA cmd和idea Terminal查看java版本不一致的解決方案,一起看看吧2023-09-09Java數(shù)組的定義、初始化、及二維數(shù)組用法分析
這篇文章主要介紹了Java數(shù)組的定義、初始化、及二維數(shù)組用法,結合具體實例形式分析了java數(shù)組概念、功能、數(shù)組定義、靜態(tài)數(shù)組、動態(tài)數(shù)組、二維數(shù)組等相關使用技巧,需要的朋友可以參考下2019-01-01SpringBoot結合ProGuard實現(xiàn)代碼混淆(最新版)
這篇文章主要介紹了SpringBoot結合ProGuard實現(xiàn)代碼混淆(最新版),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-10-10教你創(chuàng)建springcloud微服務的基礎子服務的超詳細過程
這篇文章主要介紹了創(chuàng)建springcloud微服務的基礎子服務,主要是創(chuàng)建兩個springboot服務,在教程中增加springcloud相關組件,本文分步驟給大家介紹的非常詳細,需要的朋友可以參考下2022-04-04