跳到主要内容

使用 ZooKeeper 进行分布式配置

TranslateGemma 中英对照 Distributed Configuration with Zookeeper

Zookeeper 提供一个分层命名空间,让客户端可以存储任意数据,例如配置数据。Spring Cloud Zookeeper Config 是 Config Server 和 Client 的替代方案。配置在特殊的“bootstrap”阶段加载到 Spring Environment 中。默认情况下,配置存储在 /config 命名空间中。基于应用程序的名称和活动 profile,会创建多个 PropertySource 实例,以模拟 Spring Cloud Config 解析属性的顺序。例如,一个名为 testApp 且使用 dev profile 的应用程序,会为其创建以下属性源:

  • 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:

这将连接到 Zookeeper,连接地址为默认地址 "localhost:2181"。删除 optional: 前缀将导致 Zookeeper Config 在无法连接到 Zookeeper 时失败。要更改 Zookeeper Config 的连接属性,您可以设置 spring.cloud.zookeeper.connect-string,或者将连接字符串添加到 spring.config.import 语句中,例如,spring.config.import=optional:zookeeper:myhost:2818。import 属性中的位置优先于 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 文件(属性文件或 YAML 文件)。

自定义​

Zookeeper的配置可以通过设置以下属性进行自定义:

spring:
cloud:
zookeeper:
config:
enabled: true
root: configuration
defaultContext: apps
profileSeparator: '::'
  • enabled: 将此值设置为false会禁用 ZooKeeper 配置。

  • 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