分散式配置與 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 中設定以下內容:
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
語句中。
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=true 或 spring.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
屬性的值,如以下示例所示:
org.springframework.cloud.bootstrap.BootstrapConfiguration=\ my.project.CustomCuratorFrameworkConfig,\ my.project.DefaultCuratorFrameworkConfig