使用 Zookeeper 进行分布式配置
Zookeeper 提供了一个分层命名空间,允许 Client 端存储任意数据,例如配置数据。Spring Cloud Zookeeper
Config 是 Config Server 和 Client 的替代方案。
在特殊的 “bootstrap” 期间,将配置加载到 Spring Environment 中
阶段。默认情况下,Configuration 存储在命名空间中。根据应用程序的名称和活动的
配置文件,以模拟解析属性的 Spring Cloud Config 顺序。例如,
名称为 和 配置文件的应用程序具有以下属性
为其创建的源:/config
PropertySource
testApp
dev
-
config/testApp,dev
-
config/testApp
-
config/application,dev
-
config/application
最具体的属性源位于顶部,最不具体的属性源位于底部。
命名空间中的属性适用于所有使用
zookeeper 进行配置。命名空间中的属性可用
仅对名为 的服务实例。config/application
config/testApp
testApp
当前在应用程序启动时读取配置。发送 HTTP 请求 to 会导致重新加载配置。观察配置
命名空间(Zookeeper 支持)也可用。POST
/refresh
激活
包括 enable 的依赖项
auto配置,设置 Spring Cloud Zookeeper Config。org.springframework.cloud:spring-cloud-starter-zookeeper-config
使用 Zookeeper 版本 3.4 时,您需要更改 此处所述的包含依赖项的方式。 |
Spring Boot Config 数据导入
Spring Boot 2.4 引入了一种通过属性导入配置数据的新方法。这是现在从 Zookeeper 获取配置的默认方式。spring.config.import
要选择性地连接到 Zookeeper 进行配置,请在 application.properties 中设置以下内容:
spring.config.import=optional:zookeeper:
这将连接到默认位置 “localhost:2181” 的 Zookeeper。如果无法连接到 Zookeeper,删除前缀将导致 Zookeeper Config 失败。要更改 Zookeeper Config 的连接属性,请将 connect 字符串设置或添加到语句中,例如 .import 属性中的位置优先于该属性。optional:
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
通过 .bootstrap spring.config.import |
定制
可以通过设置以下属性来自定义 Zookeeper Config:
spring:
cloud:
zookeeper:
config:
enabled: true
root: configuration
defaultContext: apps
profileSeparator: '::'
-
enabled
:将此值设置为禁用 Zookeeper Config。false
-
root
:设置配置值的基本命名空间。 -
defaultContext
:设置所有应用程序使用的名称。 -
profileSeparator
:设置用于分隔配置文件名称的分隔符的值 属性源与配置文件。
如果您已设置 或 、 或 included ,则需要将上述值放在 中,而不是 中。spring.cloud.bootstrap.enabled=true spring.config.use-legacy-processing=true spring-cloud-starter-bootstrap bootstrap.yml application.yml |
访问控制列表 (ACL)
您可以通过调用 Bean 的方法为 Zookeeper ACL 添加身份验证信息。实现此目的的一种方法是提供您自己的 bean,如以下示例所示:addAuthInfo
CuratorFramework
CuratorFramework
@BoostrapConfiguration
public class CustomCuratorFrameworkConfig {
@Bean
public CuratorFramework curatorFramework() {
CuratorFramework curator = new CuratorFramework();
curator.addAuthInfo("digest", "user:password".getBytes());
return curator;
}
}
请查阅ZookeeperAutoConfiguration类,以了解 Bean 的默认配置如何。CuratorFramework
或者,您可以从依赖于现有 bean 的类中添加凭据,如以下示例所示:CuratorFramework
@BoostrapConfiguration
public class DefaultCuratorFrameworkConfig {
public ZookeeperConfig(CuratorFramework curator) {
curator.addAuthInfo("digest", "user:password".getBytes());
}
}
此 bean 的创建必须在 boostrapping 阶段进行。您可以注册
配置类在此阶段运行,方法是为它们添加注释并将其包含在您设置为
值,如以下示例所示:@BootstrapConfiguration
org.springframework.cloud.bootstrap.BootstrapConfiguration
resources/META-INF/spring.factories
org.springframework.cloud.bootstrap.BootstrapConfiguration=\ my.project.CustomCuratorFrameworkConfig,\ my.project.DefaultCuratorFrameworkConfig