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