Distributed Configuration with Zookeeper

Zookeeper 提供了一个 hierarchical namespace,可让客户端存储任意数据,例如配置数据。Spring Cloud ZookeeperConfig 是 Config Server and 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 支持)。

Activating

依赖 org.springframework.cloud:spring-cloud-starter-zookeeper-config 可以启用自动配置,以设置 Spring Cloud Zookeeper Config。

在使用 Zookeeper 版本 3.4 时,您需要按照 here 中的说明更改包含依赖项的方式。

Spring Boot Config Data Import

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 文件(属性或 yaml)。

Customizing

可以通过设置以下属性来自定义 Zookeeper Config:

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

  • root: 设置配置值的基命名空间。

  • defaultContext: 设置所有应用程序使用的名称。

  • profileSeparator: 设置在包含配置文件的 property 源中用于分隔配置文件名的分隔符的值。

如果你已经设置了 spring.cloud.bootstrap.enabled=truespring.config.use-legacy-processing=true,或者包含了 spring-cloud-starter-bootstrap,那么上述值需要放在 bootstrap.yml 中,而不是 application.yml

Access Control Lists (ACLs)

您可以通过调用 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;
  }

}

请查阅 the ZookeeperAutoConfiguration class 以了解 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 属性的值设置)来注册在此阶段运行的配置类,如下例所示:

resources/META-INF/spring.factories
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
my.project.CustomCuratorFrameworkConfig,\
my.project.DefaultCuratorFrameworkConfig