分散式配置與 Zookeeper

Zookeeper 提供了一個分層名稱空間,允許客戶端儲存任意資料,例如配置資料。Spring Cloud Zookeeper Config 是 Config Server 和 Client 的替代方案。配置在特殊的“bootstrap”階段載入到 Spring Environment 中。預設情況下,配置儲存在 /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。移除 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 配置資料匯入方法,需要 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 的建立必須在 bootstrapping 階段進行。您可以透過使用 @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