使用 Zookeeper 的分散式配置

Zookeeper 提供階層式命名空間,讓用戶端能儲存任意資料,例如配置資料。Spring Cloud Zookeeper Config 是 Config Server 和 Client 的替代方案。配置會在特殊的「bootstrap」階段載入到 Spring 環境中。預設情況下,配置儲存在 /config 命名空間中。系統會根據應用程式的名稱和作用中的設定檔建立多個 PropertySource 實例,以模擬 Spring Cloud Config 解析屬性的順序。例如,名稱為 testApp 且具有 dev 設定檔的應用程式會為其建立下列屬性來源

  • config/testApp,dev

  • config/testApp

  • config/application,dev

  • config/application

最特定的屬性來源位於頂端,最不特定的則位於底端。config/application 命名空間中的屬性適用於所有使用 zookeeper 進行配置的應用程式。config/testApp 命名空間中的屬性僅適用於名為 testApp 的服務實例。

配置目前在應用程式啟動時讀取。傳送 HTTP POST 請求至 /refresh 會導致重新載入配置。監看配置命名空間(Zookeeper 支援)也可用。

啟用

包含 org.springframework.cloud:spring-cloud-starter-zookeeper-config 的依賴項會啟用自動配置,進而設定 Spring Cloud Zookeeper Config。

使用 Zookeeper 3.4 版時,您需要變更包含依賴項的方式,如此處所述

Spring Boot 配置資料匯入

Spring Boot 2.4 導入了一種透過 spring.config.import 屬性匯入配置資料的新方法。現在這是從 Zookeeper 取得配置的預設方式。

若要選擇性地連線至 Zookeeper 以進行配置,請在 application.properties 中設定以下內容

application.properties
spring.config.import=optional:zookeeper:

這會連線至預設位置「localhost:2181」的 Zookeeper。移除 optional: 前綴會導致 Zookeeper Config 在無法連線至 Zookeeper 時失敗。若要變更 Zookeeper Config 的連線屬性,請設定 spring.cloud.zookeeper.connect-string,或將連線字串新增至 spring.config.import 陳述式,例如 spring.config.import=optional:zookeeper:myhost:2818。匯入屬性中的位置優先於 connect-string 屬性。

Zookeeper Config 會嘗試從四個自動環境內容載入值,這些內容基於 spring.cloud.zookeeper.config.name(預設為 spring.application.name 屬性的值)和 spring.cloud.zookeeper.config.default-context(預設為 application)。如果您想要指定環境內容,而不是使用計算出的環境內容,您可以將該資訊新增至 spring.config.import 陳述式。

application.properties
spring.config.import=optional:zookeeper:myhost:2181/contextone;/context/two

這會選擇性地僅從 /contextone/context/two 載入配置。

透過 spring.config.import 匯入的 Spring Boot Config Data 方法不需要 bootstrap 檔案(properties 或 yaml)。

自訂

可以透過設定下列屬性來自訂 Zookeeper Config

spring:
  cloud:
    zookeeper:
      config:
        enabled: true
        root: configuration
        defaultContext: apps
        profileSeparator: '::'
  • enabled:將此值設定為 false 會停用 Zookeeper Config。

  • root:設定配置值的基底命名空間。

  • defaultContext:設定所有應用程式使用的名稱。

  • profileSeparator:設定分隔符號的值,該分隔符號用於分隔具有設定檔的屬性來源中的設定檔名稱。

如果您已設定 spring.cloud.bootstrap.enabled=truespring.config.use-legacy-processing=true,或包含 spring-cloud-starter-bootstrap,則上述值需要放置在 bootstrap.yml 而不是 application.yml 中。

存取控制清單 (ACL)

您可以透過呼叫 CuratorFramework Bean 的 addAuthInfo 方法,為 Zookeeper ACL 新增驗證資訊。達成此目的的一種方法是提供您自己的 CuratorFramework Bean,如下列範例所示

@BoostrapConfiguration
public class CustomCuratorFrameworkConfig {

  @Bean
  public CuratorFramework curatorFramework() {
    CuratorFramework curator = new CuratorFramework();
    curator.addAuthInfo("digest", "user:password".getBytes());
    return curator;
  }

}

請參閱ZookeeperAutoConfiguration 類別,以查看 CuratorFramework Bean 的預設配置。

或者,您可以從依賴現有 CuratorFramework Bean 的類別新增您的憑證,如下列範例所示

@BoostrapConfiguration
public class DefaultCuratorFrameworkConfig {

  public ZookeeperConfig(CuratorFramework curator) {
    curator.addAuthInfo("digest", "user:password".getBytes());
  }

}

此 Bean 的建立必須在引導階段期間發生。您可以註冊配置類別,以在此階段期間執行,方法是使用 @BootstrapConfiguration 註釋它們,並將它們包含在逗號分隔的清單中,您將該清單設定為 resources/META-INF/spring.factories 檔案中 org.springframework.cloud.bootstrap.BootstrapConfiguration 屬性的值,如下列範例所示

resources/META-INF/spring.factories
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
my.project.CustomCuratorFrameworkConfig,\
my.project.DefaultCuratorFrameworkConfig