Spring Boot可以說(shuō)是目前最火的開(kāi)發(fā)框架了缠诅,幾乎所有新的企業(yè)應(yīng)用都會(huì)優(yōu)先考慮使用Spring Boot哑蔫,甚至一些之前老的應(yīng)用系統(tǒng)也會(huì)改造為Spring Boot構(gòu)建钉寝。其約定優(yōu)于配置的特性使開(kāi)發(fā)工作變得簡(jiǎn)單,大大節(jié)省了開(kāi)發(fā)工作量和成本闸迷。Java
也是因?yàn)閾碛泻蚐pring Boot一樣優(yōu)秀的眾多開(kāi)源框架嵌纲,才能一直在編程語(yǔ)言排行榜前幾名。
一個(gè)應(yīng)用程序腥沽,不可避免的要使用各種配置文件逮走,比如配置應(yīng)用名稱,應(yīng)用版本今阳,應(yīng)用服務(wù)端口等师溅。Spring Boot本身提供了多種配置方式,你可以把配置寫在application.yml
中盾舌,通常我們會(huì)使用spring.profiles.active
來(lái)進(jìn)行配置分離墓臭,實(shí)現(xiàn)應(yīng)用在不同環(huán)境下使用不同的配置參數(shù)。但是這樣有一個(gè)問(wèn)題妖谴,就是這些配置必須都提前配置好窿锉,比如dev
環(huán)境使用什么參數(shù)、prod
環(huán)境使用什么參數(shù)窖维,這些配置都被打包進(jìn)了我們的應(yīng)用榆综。而當(dāng)我們需要改變某個(gè)配置是則需要重新打包發(fā)布,這是非常麻煩的铸史,尤其是當(dāng)我們使用云平臺(tái)鼻疮、自動(dòng)化部署、容器等服務(wù)時(shí)琳轿,重新打包會(huì)造成不必要的浪費(fèi)判沟,畢竟我們只是修改了一個(gè)配置而已耿芹,并且大多數(shù)企業(yè)對(duì)于這種重新打包發(fā)布很敏感,你很難在生產(chǎn)環(huán)境實(shí)現(xiàn)重新部署(各種審核流程)挪哄。
Spring Boot可以讀取環(huán)境變量(宿主機(jī)吧秕,運(yùn)行容器等),在云平臺(tái)越來(lái)越流行的今天迹炼,我們的服務(wù)通常不是運(yùn)行在一個(gè)真實(shí)的物理機(jī)上面的砸彬。使用這些容器平臺(tái)很容配置我們想要的環(huán)境變量,把我們的配置暴露給環(huán)境變量斯入,可以方便我們的應(yīng)用部署和參數(shù)調(diào)整砂碉。
比如,我需要配置應(yīng)用連接數(shù)據(jù)庫(kù)的配置刻两,通常我們?cè)?code>application.yml或者使用指定環(huán)境的application-prod.yml
配置文件增蹭,寫入以下配置:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1/demo?serverTimezone=Asia/Shanghai
username: demo
password: demo
hikari:
maximum-pool-size: 30
max-lifetime: 60000
minimum-idle: 5
像上面那樣,如果這時(shí)如果我們的數(shù)據(jù)庫(kù)的用戶密碼變了或者我們想調(diào)整一個(gè)連接池的相關(guān)配置磅摹,一般來(lái)講我們需要修改以上配置文件滋迈,然后重新打包發(fā)布(或者你說(shuō)可以在壓縮包內(nèi)修改配置文件?户誓?)饼灿,這種方式真是太糟糕了。
現(xiàn)在看看如果我們使用環(huán)境變量的方式來(lái)配置我們的參數(shù)厅克,如下:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: ${DEMO_APP_JDBC_URL:jdbc:mysql://127.0.0.1/demo?serverTimezone=Asia/Shanghai}
username: ${DEMO_APP_JDBC_USERNAME:demo}
password: ${DEMO_APP_JDBC_PASSWORD:demo}
hikari:
maximum-pool-size: ${DEMO_APP_JDBC_POOL_MAX_SIZE:30}
max-lifetime: ${DEMO_APP_JDBC_POOL_MAX_LIFE_TIME:60000}
minimum-idle: ${DEMO_APP_JDBC_POOL_MIN_SIZE:5}
以上使用${ENV:defauleValue}
的形式配置了我們應(yīng)用的相關(guān)參數(shù)赔退,如果我們的運(yùn)行環(huán)境配置了上面用到的環(huán)境變量,則使用環(huán)境變量中的配置证舟,如果沒(méi)有配置則使用默認(rèn)的硕旗,比如我配置了環(huán)境變量DEMO_APP_JDBC_POOL_MAX_SIZE = 100
,則應(yīng)用程序中的連接池最大連接數(shù)就變成100
了女责。使用這種方式我們甚至沒(méi)必要使用spring.profiles.active
來(lái)指定不同的配置文件了漆枚,簡(jiǎn)直一舉兩得。
注意:以上方式通常適用于云抵知、容器等應(yīng)用環(huán)境的部署墙基,因?yàn)檫\(yùn)行環(huán)境是被我們的應(yīng)用獨(dú)享的。我想你不愿意在一個(gè)運(yùn)行著多個(gè)應(yīng)用服務(wù)的環(huán)境上面配置這么多個(gè)性化的環(huán)境變量刷喜。