Spring Boot 利用 YAML 變量引用來(lái)簡(jiǎn)化配置

微服務(wù)開(kāi)發(fā)中,我們往往會(huì)為每一個(gè)服務(wù)創(chuàng)建一個(gè)獨(dú)立的數(shù)據(jù)庫(kù);同一個(gè)服務(wù)在不同的環(huán)境中也會(huì)連接到不同的數(shù)據(jù)庫(kù)實(shí)例中。這就導(dǎo)致我們數(shù)據(jù)源的配置變得非常復(fù)雜。

以 Spring Boot + MySQL 為例,我會(huì)簡(jiǎn)單描述一下配置思路,供大家學(xué)習(xí)交流。

最早期,大多數(shù)情況下都會(huì)這樣配置:

spring.datasource:
  url: jdbc:mysql://127.0.0.1:3306/database1?foo=bar
  username: user
  password: pass

當(dāng)你的公司正在深度使用微服務(wù)開(kāi)發(fā),有一堆微服務(wù),并且還開(kāi)了多個(gè)開(kāi)發(fā)環(huán)境時(shí),這種配置方式需要你維護(hù) m*n 個(gè)配置。

在我們公司的場(chǎng)景中:我們每個(gè)服務(wù)擁有一個(gè)獨(dú)立的數(shù)據(jù)庫(kù),但是多個(gè)庫(kù)在一個(gè)實(shí)例上。不同環(huán)境上,同一個(gè)服務(wù)的數(shù)據(jù)庫(kù)名不會(huì)變;同一個(gè)環(huán)境中,數(shù)據(jù)庫(kù)的連接地址域名和端口不會(huì)變。即:每個(gè)環(huán)境跑了單獨(dú)的 mysql 實(shí)例,配置了所有的服務(wù)數(shù)據(jù)庫(kù),使用一個(gè)集中式的 Spring Cloud Config 配置中心,通過(guò) profile 切換不同環(huán)境的配置。所有環(huán)境的所有服務(wù),配置的 spring.datasource.url 都是不同的,但是又是相似的,有跡可循的。

Spring 的 MySQL JDBC 配置 spring.datasource.url 并不支持把連接地址的 hostdatabase name 拆分開(kāi)???沒(méi)關(guān)系,我們可以使用 YAML 配置文件的變量引用。

我們可以通過(guò)變通的方式巧妙地把 spring.datasource.url 拆分開(kāi),使用如下方式:

spring.datasource:
  url: jdbc:mysql://${spring.datasource.host}/${spring.datasource.database}?${spring.datasource.params}
  username: user
  password: pass

我們?cè)谏厦娲a中定義了幾個(gè)自定義變量,但是值得注意的是,這幾個(gè)變量并不是 spring datasource 本身所支持的變量。但是通過(guò)這種方式,我們就可以使用 m+n 個(gè)配置就可以搞定所有環(huán)境啦。

# application.yml 指定所有的服務(wù)直接相關(guān)的數(shù)據(jù)庫(kù)連接地址參數(shù)
spring.datasource.url: jdbc:mysql://${spring.datasource.host}/${spring.datasource.database}?${spring.datasource.params}

# m 個(gè)環(huán)境負(fù)責(zé)自己的 host
# application-xxxx.yml xxxx開(kāi)發(fā)環(huán)境
spring.datasource.host: jdbc:mysql://127.0.0.1:3306
# application-rc.yml  rc環(huán)境
spring.datasource.host: jdbc:mysql://127.0.0.1:3307
# application-staging.yml 預(yù)發(fā)環(huán)境
spring.datasource.host: jdbc:mysql://127.0.0.1:3308
# application-production.yml 生產(chǎn)環(huán)境(生產(chǎn)環(huán)境我推薦還是放在獨(dú)立的配置中心,這里僅僅舉個(gè)例子)
spring.datasource.host: jdbc:mysql://127.0.0.1:3309

# n 個(gè)服務(wù)負(fù)責(zé)自己的 database
# user service
spring.datasource.database: user
# foo service
spring.datasource.database: foo
# bar service
spring.datasource.database: bar

這樣下來(lái),配置中心只需要維護(hù)各個(gè)服務(wù)獨(dú)立的 xxx-service.yml 和一個(gè)對(duì)應(yīng)環(huán)境的 application-env.yml 就可以了。原來(lái)可能需要幾十幾百個(gè)配置文件,現(xiàn)在直接縮減了一個(gè)數(shù)量級(jí)。增加環(huán)境只需要增加 application-env.yml,增加服務(wù)只需要增加 xxx-service.yml。

在我們的實(shí)際操作中,原先約 30 多個(gè)服務(wù),存在 5 個(gè)開(kāi)發(fā)環(huán)境的情況下,需要至少 150 個(gè)配置文件來(lái)管理數(shù)據(jù)庫(kù)連接地址這個(gè)屬性,但是經(jīng)過(guò)這樣的變更之后,我們只需要 35 個(gè)配置文件即可管理所有的配置。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容