使用 Zookeeper 進行分散式配置

Zookeeper 提供了一個 分層名稱空間,允許客戶端儲存任意資料,例如配置資料。Spring Cloud Zookeeper Config 是 配置伺服器和客戶端 的替代方案。配置在特殊的“引導”階段載入到 Spring 環境中。預設情況下,配置儲存在 /config 名稱空間中。根據應用程式的名稱和活動配置檔案建立多個 PropertySource 例項,以模仿 Spring Cloud Config 解析屬性的順序。例如,對於名為 testApp 且帶有 dev 配置檔案的應用程式,會為其建立以下屬性源:

  • config/testApp,dev

  • config/testApp

  • config/application,dev

  • config/application

最具體的屬性源在頂部,最不具體的在底部。config/application 名稱空間中的屬性適用於所有使用 Zookeeper 進行配置的應用程式。config/testApp 名稱空間中的屬性僅對名為 testApp 的服務例項可用。

配置當前在應用程式啟動時讀取。向 /refresh 傳送 HTTP POST 請求會導致配置重新載入。還支援監視配置名稱空間(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。如果無法連線到 Zookeeper,刪除 optional: 字首將導致 Zookeeper Config 失敗。要更改 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配置資料匯入方法不需要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 中。

訪問控制列表 (ACLs)

您可以透過呼叫 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
© . This site is unofficial and not affiliated with VMware.