78. 使用 Zookeeper 分发 Configuration

Zookeeper 提供了一个分层命名空间,它允许 clients store 任意数据,例如 configuration 数据。 Spring Cloud Zookeeper Config 是配置服务器和 Client的替代品。 Configuration 在特殊的“bootstrap”阶段加载到 Spring 环境中。 Configuration 默认存储在/config命名空间中。基于 application 的 name 和 active profiles 创建多个PropertySource实例,以模仿解析 properties 的 Spring Cloud Config order。对于 example,具有 name testAppdev profile 的 application 具有为其创建的以下 property 源:

  • config/testApp,dev

  • config/testApp

  • config/application,dev

  • config/application

最具体的 property 源位于顶部,底部最不具体。 config/application名称空间中的 Properties 适用于使用 zookeeper 进行 configuration 的所有 applications。 config/testApp名称空间中的 Properties 仅适用于名为testApp的服务的实例。

Configuration 目前在启动 application 时读取。将 HTTP POST请求发送到/refresh会导致重新加载 configuration。目前尚未实现_Coniguration 命名空间(Zookeeper 支持)。

78.1 激活

包含对org.springframework.cloud:spring-cloud-starter-zookeeper-config的依赖启用自动配置_set Spring Cloud Zookeeper Config。

使用 Zookeeper 的 version 3.4 时,您需要更改包含依赖关系的方式,如这里所述。

78.2 自定义

可以通过设置以下 properties 来自定义 Zookeeper 配置:

bootstrap.yml.

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

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

  • defaultContext:设置所有 applications 使用的 name。

  • profileSeparator:设置用于将 property 源中的 profile name 与 profiles 分隔开的分隔符的 value。

78.3 访问控制列表(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 class以查看CuratorFramework bean 的默认 configuration。

或者,您可以从依赖于现有CuratorFramework bean 的 class 添加凭据,如以下 example 所示:

@BoostrapConfiguration
public class DefaultCuratorFrameworkConfig {

  public ZookeeperConfig(CuratorFramework curator) {
    curator.addAuthInfo("digest", "user:password".getBytes());
  }

}

这个 bean 的创建必须在 boostrapping 阶段进行。您可以在此阶段将 configuration classes 注册到 run,方法是使用@BootstrapConfiguration注释它们并将它们包含在 comma-separated 列表中,并将其设置为resources/META-INF/spring.factories文件中org.springframework.cloud.bootstrap.BootstrapConfiguration property 的 value,如下面的示例所示:

resources/META-INF/spring.factories.

org.springframework.cloud.bootstrap.BootstrapConfiguration=\
my.project.CustomCuratorFrameworkConfig,\
my.project.DefaultCuratorFrameworkConfig