共用方式為


在 Azure Container Apps 中設定 Spring 元件的 Config Server 設定 (預覽)

Config Server for Spring 提供集中式位置,讓設定數據可供多個應用程式使用。 使用下列指引來瞭解如何設定和管理 Spring 元件的 Config Server。

顯示

您可以使用 命令,依名稱 show 檢視個別元件的詳細數據。

執行下列命令之前,請以您的值取代以 <> 括住的預留位置。

az containerapp env java-component config-server-for-spring show \
  --environment <ENVIRONMENT_NAME> \
  --resource-group <RESOURCE_GROUP> \
  --name <JAVA_COMPONENT_NAME>

清單​​

您可以使用 命令列出所有已註冊的 list Java 元件。

執行下列命令之前,請以您的值取代以 <> 括住的預留位置。

az containerapp env java-component list \
  --environment <ENVIRONMENT_NAME> \
  --resource-group <RESOURCE_GROUP>

繫結

--bind使用 命令的 update 參數,在 Spring 元件的 Config Server 與容器應用程式之間建立連線。

執行下列命令之前,請以您的值取代以 <> 括住的預留位置。

az containerapp update \
  --name <CONTAINER_APP_NAME> \
  --resource-group <RESOURCE_GROUP> \
  --bind <JAVA_COMPONENT_NAME>

解除系結

若要中斷容器應用程式與 Spring 元件的 Config Server 之間的連線,請使用 --unbind 命令的 update 參數。

執行下列命令之前,請以您的值取代以 <> 括住的預留位置。

az containerapp update \
  --name <CONTAINER_APP_NAME> \
  --unbind <JAVA_COMPONENT_NAME> \
  --resource-group <RESOURCE_GROUP>

設定選項

az containerapp update命令會--configuration使用 參數來控制如何設定 Spring 的 Config Server。 只要多個參數是以空格分隔,就可以一次使用多個參數。 您可以在 Spring Cloud Config Server 檔中找到更多詳細數據。

下表列出可用的不同組態值。

Git 後端組態

名稱 描述
spring.cloud.config.server.git.uri
spring.cloud.config.server.git.repos.{repoName}.uri
遠端存放庫的 URI。
spring.cloud.config.server.git.username
spring.cloud.config.server.git.repos.{repoName}.username
使用遠端存放庫進行驗證的用戶名稱。
spring.cloud.config.server.git.password
spring.cloud.config.server.git.repos.{repoName}.password
使用遠端存放庫進行驗證的密碼。
spring.cloud.config.server.git.search-paths
spring.cloud.config.server.git.repos.{repoName}.search-paths
搜尋要在本機工作複本中使用的路徑。 根據預設,只會搜尋根目錄。
spring.cloud.config.server.git.force-pull
spring.cloud.config.server.git.repos.{repoName}.force-pull
旗標,表示存放庫應該強制提取。 如果為 true,請捨棄任何本機變更,並從遠端存放庫取得。
spring.cloud.config.server.git.default-label
spring.cloud.config.server.git.repos.{repoName}.default-label
Git 所使用的預設標籤是main。 如果您未設定 spring.cloud.config.server.git.default-label,且名為 main 的分支不存在,則組態伺服器預設也會嘗試簽出名為 master 的分支。 如果您想要停用後援分支行為,您可以將 spring.cloud.config.server.git.tryMasterBranch 設定為 false。
spring.cloud.config.server.git.try-master-branch
spring.cloud.config.server.git.repos.{repoName}.try-master-branch
根據預設,組態伺服器會嘗試簽出名為 master 的分支。
spring.cloud.config.server.git.skip-ssl-validation
spring.cloud.config.server.git.repos.{repoName}.skip-ssl-validation
您可以將 git.skipSslValidation 屬性設定為 true,以停用組態伺服器的 Git 伺服器 SSL 憑證驗證。
spring.cloud.config.server.git.clone-on-start
spring.cloud.config.server.git.repos.{repoName}.clone-on-start
旗標,表示應該在啟動時複製存放庫(而不是隨選)。 通常會導致啟動速度較慢,但第一次查詢的速度較快。
spring.cloud.config.server.git.timeout
spring.cloud.config.server.git.repos.{repoName}.timeout
取得 HTTP 或 SSH 連線的逾時(以秒為單位)(如果適用)。 預設為5秒。
spring.cloud.config.server.git.refresh-rate
spring.cloud.config.server.git.repos.{repoName}.refresh-rate
設定伺服器會從 Git 後端擷取更新的組態數據的頻率。
spring.cloud.config.server.git.private-key
spring.cloud.config.server.git.repos.{repoName}.private-key
有效的 SSH 私密鑰。 如果 ignore-local-ssh-settings 為 true,且 Git URI 為 SSH 格式,則必須設定 。
spring.cloud.config.server.git.host-key
spring.cloud.config.server.git.repos.{repoName}.host-key
有效的 SSH 主機金鑰。 如果同時設定 host-key-algorithm,則必須設定 。
spring.cloud.config.server.git.host-key-algorithm
spring.cloud.config.server.git.repos.{repoName}.host-key-algorithm
其中一個 ssh-dss、ssh-rsa、ssh-ed25519、ecdsa-sha2-nistp256、ecdsa-sha2-nistp384 或 ecdsa-sha2-nistp521。 如果同時設定 host-key,則必須設定 。
spring.cloud.config.server.git.strict-host-key-checking
spring.cloud.config.server.git.repos.{repoName}.strict-host-key-checking
true 或 false。 如果為 false,請忽略主機金鑰的錯誤。
spring.cloud.config.server.git.repos.{repoName} 遠端存放庫的 URI。
spring.cloud.config.server.git.repos.{repoName}.pattern 模式格式是具有通配符的 {application}/{profile} 名稱逗號分隔列表。 如果 {application}/{profile} 不符合任何模式,它會使用下定義的預設 URI。

一般設定

  • 記錄相關組態

  • spring.cloud.config.server.overrides

    • 將屬性來源無條件傳送至所有客戶端的額外對應。
  • spring.cloud.config.override-none

    • 您可以將用戶端中所有覆寫的優先順序變更為更像是預設值,讓應用程式在環境變數或系統屬性中提供自己的值,方法是在遠端存放庫中設定 spring.cloud.config.override-none=true 旗標(預設值為 false)。
  • spring.cloud.config.allow-override

    • 如果您啟用組態第一次啟動程式,您可以允許用戶端應用程式在來自組態伺服器的應用程式組態中放置兩個屬性,以覆寫組態伺服器的組態。
  • spring.cloud.config.server.health。

    • 您可以設定健全狀況指標來檢查更多應用程式以及自訂設定檔和自定義標籤
  • spring.cloud.config.server.accept-empty

    • 如果找不到應用程式,您可以設定 spring.cloud.config.server.accept-emptyfalse ,讓伺服器傳回 HTTP 404 狀態。 根據預設,此旗標會設定為 true
  • 加密和解密 (對稱)

    • encrypt.key
      • 使用對稱密鑰很方便,因為它是要設定的單一屬性值。
    • spring.cloud.config.server.encrypt.enabled
      • 您可以將此設定為 false,以停用伺服器端解密。

Refresh

取用屬性的服務在發生之前必須知道變更。 適用於 Spring 的 Config Server 的預設通知方法牽涉到手動觸發重新整理事件,例如呼叫 https://<YOUR_CONFIG_CLIENT_HOST_NAME>/actuator/refresh重新整理 ,如果有許多應用程式實例,則可能無法使用。

相反地,您可以讓設定客戶端根據重新整理內部輪詢變更,自動重新整理 Config Server 的值。 使用下列步驟,從 Config Server 自動重新整理值。

  1. 註冊排程的工作,以在指定的間隔中重新整理內容,如下列範例所示。

    @Configuration
    @AutoConfigureAfter({RefreshAutoConfiguration.class, RefreshEndpointAutoConfiguration.class})
    @EnableScheduling
    public class ConfigClientAutoRefreshConfiguration implements SchedulingConfigurer {
        @Value("${spring.cloud.config.refresh-interval:60}")
        private long refreshInterval;
        @Value("${spring.cloud.config.auto-refresh:false}")
        private boolean autoRefresh;
        private final RefreshEndpoint refreshEndpoint;
        public ConfigClientAutoRefreshConfiguration(RefreshEndpoint refreshEndpoint) {
            this.refreshEndpoint = refreshEndpoint;
        }
        @Override
        public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
            if (autoRefresh) {
                // set minimal refresh interval to 5 seconds
                refreshInterval = Math.max(refreshInterval, 5);
                scheduledTaskRegistrar.addFixedRateTask(refreshEndpoint::refresh,  Duration.ofSeconds(refreshInterval));
            }
        }
    }
    
  2. 在application.yml檔案中啟用autorefresh並設定適當的重新整理間隔。 在下列範例中,用戶端每隔 60 秒輪詢一次組態變更,這是您可以針對重新整理間隔設定的最小值。

    根據預設, autorefresh 會設定為 false,並將 refresh-interval 設定為 60 秒。

    spring:
        cloud:
            config:
            auto-refresh: true
            refresh-interval: 60
    management:
        endpoints:
            web:
            exposure:
                include:
                - refresh
    
  3. 在您的程式代碼中新增 @RefreshScope 。 在下列範例中,變數 connectTimeout 會每隔 60 秒自動重新整理一次。

    @RestController
    @RefreshScope
    public class HelloController {
        @Value("${timeout:4000}")
        private String connectTimeout;
    }
    

使用對稱金鑰進行加密和解密

伺服器端解密

根據預設,會啟用伺服器端加密。 使用下列步驟在應用程式中啟用解密。

  1. 在 Git 存放庫中的 .properties 檔案中新增加密的屬性。

    例如,您的檔案應該類似下列範例:

    message={cipher}f43e3df3862ab196a4b367624a7d9b581e1c543610da353fbdd2477d60fb282f
    
  2. 更新 Spring Java 元件的元件的元件伺服器,以使用具有加密屬性並設定加密金鑰的 Git 存放庫。

    執行下列命令之前,請以您的值取代以 <> 括住的預留位置。

    az containerapp env java-component config-server-for-spring update \
      --environment <ENVIRONMENT_NAME> \
      --resource-group <RESOURCE_GROUP> \
      --name <JAVA_COMPONENT_NAME> \
      --configuration spring.cloud.config.server.git.uri=<URI> encrypt.key=randomKey
    

用戶端解密

您可以遵循下列步驟,使用屬性的用戶端解密:

  1. 在 Git 存放庫中的檔案中 *.properties* 新增加密屬性。

  2. 更新 Config Server for Spring Java 元件,以使用具有加密屬性並停用伺服器端解密的 Git 存放庫。

    執行下列命令之前,請以您的值取代以 <> 括住的預留位置。

    az containerapp env java-component config-server-for-spring update \
      --environment <ENVIRONMENT_NAME> \
      --resource-group <RESOURCE_GROUP> \
      --name <JAVA_COMPONENT_NAME> \
      --configuration spring.cloud.config.server.git.uri=<URI> spring.cloud.config.server.encrypt.enabled=false
    
  3. 在您的用戶端應用程式中,將解密金鑰 ENCRYPT_KEY=randomKey 新增為環境變數。

    或者,如果您在 上加入 spring-cloud-starter-bootstrap,或設定spring.cloud.bootstrap.enabled=true為系統屬性,請在 中bootstrap.properties設定 encrypt.keyclasspath

    執行下列命令之前,請以您的值取代以 <> 括住的預留位置。

    az containerapp update \
      --name <APP_NAME> \
      --resource-group <RESOURCE_GROUP> \
         --set-env-vars "ENCRYPT_KEY=randomKey"
    
    encrypt:
      key: somerandomkey
    

下一步