除了從本機檔案直接取得組態來源之外,也可以從 Git Repository 取得組態,這只要在〈組態伺服器〉的 application.properties 設定:
server.port=8888
spring.cloud.config.server.git.uri=D:/git/cloud-config-demo
spring.cloud.config.server.git.searchPaths=git-config/gossip
cloud-config-demo 是你的 repository,若組態檔位於其中的目錄,可以使用 spring.cloud.config.server.git.searchPaths
來指定,多個目錄的話,使用逗號區隔。
在這邊只要將〈組態伺服器〉中的 *.properties 放到 git-config/gossip 目錄之中就可以了。
spring.cloud.config.server.git.uri
可以指定本地 Git,也可以是遠端 Git,不過在這之前,得考慮保護一下敏感的組態資訊,像是服務的登入名稱、密碼之類,可以使用對稱加密來加密這類資訊。
若要如此,在組態伺服器啟動的環境中,加入環境變數 ENCRYPT_KEY
,值設定為要共享的加密金鑰,在這邊簡單地設為 CATERPILLAR_KEY
(使用 Spring Tool Suite 的話,可以直接在 Run Configurations 中設定,記得保管好你的金鑰),然後啟動組態伺服器,加密與解密可請求的介面分別是 /encrypt
與 /decrypt
,可透過 POST
來請求。
例如,使用 Postman 來對 /encrypt
發出請求,對敏感的資訊加密:
底下就是加密後的結果,分別加密名稱與密碼之後複製結果,將之貼到組態檔案之中,並前置 {cipher}
:
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:tcp://localhost/c:/workspace/gossip/gossip
spring.datasource.username={cipher}41a0d800c2a1dc55348ddf3c4cabccf53a6de921be7b761c7646faeefe1aadbe
spring.datasource.password={cipher}55ae5203e663abf372e4a4068e466eeb81f85d26a59fe6f0af7e3b3a817d872a
spring.mail.host=smtp.gmail.com
spring.mail.port=587
spring.mail.username={cipher}9711e2abfed4c2a41df7fb8b0e2023df4786f3da26cabc76628f09d441e3de8568b356186a0750054ffce5142249f5af
spring.mail.password={cipher}0bd3c981a08aeff900c061f0d217cd37bbc0ac2327c1c38faa8c2f229010b569
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
(嚴格來說,資料庫名稱、JDBC URL 等最好也加密,不過,為了之後範例修改方便,這邊就不加密了。)
現在組態檔中敏感資訊已經看不出原始設定了,來請求一下 http://localhost:8888/gossip/default
:
{
"name": "gossip",
"profiles": [
"default"
],
"label": null,
"version": "38c92f25fa54bbd0f675a87e68e64530a62c8466",
"state": null,
"propertySources": [
{
"name": "D:/git/cloud-config-demo/git-config/gossip/gossip.properties",
"source": {
"spring.datasource.driver-class-name": "org.h2.Driver",
"spring.datasource.url": "jdbc:h2:tcp://localhost/c:/workspace/gossip/gossip",
"spring.mail.host": "smtp.gmail.com",
"spring.mail.port": "587",
"spring.mail.properties.mail.smtp.auth": "true",
"spring.mail.properties.mail.smtp.starttls.enable": "true",
"spring.datasource.username": "caterpillar",
"spring.datasource.password": "12345678",
"spring.mail.username": "yourname@gmail.com",
"spring.mail.password": "yourpassword"
}
}
]
}
組態伺服器預設會使用共享金鑰自動解密,然而,如果有人知道了組態伺服器的位址,就可以獲取敏感的組態資訊,你可以停用組態伺服器的解密,這可以在 bootstrap.properties 中加入設定:
spring.cloud.config.server.encrypt.enabled=false
來請求一下 http://localhost:8888/gossip/default
:
{
"name": "gossip",
"profiles": [
"default"
],
"label": null,
"version": "38c92f25fa54bbd0f675a87e68e64530a62c8466",
"state": null,
"propertySources": [
{
"name": "D:/git/cloud-config-demo/git-config/gossip/gossip.properties",
"source": {
"spring.datasource.driver-class-name": "org.h2.Driver",
"spring.datasource.url": "jdbc:h2:tcp://localhost/c:/workspace/gossip/gossip",
"spring.datasource.username": "{cipher}41a0d800c2a1dc55348ddf3c4cabccf53a6de921be7b761c7646faeefe1aadbe",
"spring.datasource.password": "{cipher}55ae5203e663abf372e4a4068e466eeb81f85d26a59fe6f0af7e3b3a817d872a",
"spring.mail.host": "smtp.gmail.com",
"spring.mail.port": "587",
"spring.mail.username": "{cipher}9711e2abfed4c2a41df7fb8b0e2023df4786f3da26cabc76628f09d441e3de8568b356186a0750054ffce5142249f5af",
"spring.mail.password": "{cipher}0bd3c981a08aeff900c061f0d217cd37bbc0ac2327c1c38faa8c2f229010b569",
"spring.mail.properties.mail.smtp.auth": "true",
"spring.mail.properties.mail.smtp.starttls.enable": "true"
}
}
]
}
現在組態伺服器不負責解密了,客戶端自然得負責解密的工作,這需要在客戶端的 build.gradle 中加入相依:
implementation('org.springframework.security:spring-security-rsa:1.0.8.RELEASE')
然後同樣在環境變數中加入 ENCRYPT_KEY
,值設定為要共享的加密金鑰 CATERPILLAR_KEY
,這樣客戶端就能解密了。
接下來,你可以將組態檔上傳至遠端的 Git 伺服器,並修改組態伺服器的 application.properties:
server.port=8888
spring.cloud.config.server.git.uri=https://github.com/JustinSDK/cloud-config-demo
spring.cloud.config.server.git.searchPaths=git-config/gossip
如果是個私有的 Repository,可以使用 spring.cloud.config.server.git.username
、spring.cloud.config.server.git.password
來指定使用者名稱與密碼,接著,記得移除組態伺服器上的 環境變數 ENCRYPT_KEY
(你總不會希望別人透過 /decrypt
來解密吧!),重新啟動組態伺服器就可以了。
你可以在 GitConfig 找到以上的範例專案。