微服務(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 并不支持把連接地址的 host 和 database 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è)配置文件即可管理所有的配置。