Git 組態來源


除了從本機檔案直接取得組態來源之外,也可以從 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 發出請求,對敏感的資訊加密:

Git 組態來源

底下就是加密後的結果,分別加密名稱與密碼之後複製結果,將之貼到組態檔案之中,並前置 {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.usernamespring.cloud.config.server.git.password 來指定使用者名稱與密碼,接著,記得移除組態伺服器上的 環境變數 ENCRYPT_KEY(你總不會希望別人透過 /decrypt 來解密吧!),重新啟動組態伺服器就可以了。

你可以在 GitConfig 找到以上的範例專案。