8. 使用Zookeeper的分布式配置

Zookeeper提供了一个 层次化的命名空间 ,让客户端可以存储任意数据,如配置数据。Spring Cloud Zookeeper Config是Config Server和Client的替代方案。 配置在特殊的“bootstrap”阶段加载到Spring Environment中。默认情况下,配置存储在/config命名空间中。根据应用程序的名称和活动配置文件创建多个PropertySource实例,以模仿Spring Cloud Config解析属性的顺序。例如,一个名为testApp的应用程序和带有dev配置文件的应用程序为它创建了以下属性源:spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

最具体的属性源在顶部,最不具体的在底部。spring-doc.cadn.net.cn

config/application命名空间中的属性适用于所有使用zookeeper进行配置的应用程序。在config/testApp命名空间中的属性仅对名为testApp的服务实例可用。spring-doc.cadn.net.cn

spring-doc.cadn.net.cn

配置在应用程序启动时读取。向 /refresh 发送 HTTP POST 请求会使配置重新加载。目前不支持通过监视配置命名空间(Zookeeper 支持)来实现。spring-doc.cadn.net.cn

8.1. 激活

Including a dependency on org.springframework.cloud:spring-cloud-starter-zookeeper-config enables autoconfiguration that sets up Spring Cloud Zookeeper Config.spring-doc.cadn.net.cn

在使用 Zookeeper 版本 3.4 时,需要更改 包含依赖的方式,如在 此处 所描述。

8.2. Spring Boot 配置数据导入

Spring Boot 2.4 引入了一种通过 spring.config.import 属性导入配置数据的新方式。这种方式现在是从 Zookeeper获取配置的默认方式。spring-doc.cadn.net.cn

可选地通过在 application.properties 中设置以下内容连接到 Zookeeper 以进行配置:spring-doc.cadn.net.cn

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:2818connect-string属性中的导入位置优先于connect-string属性。spring-doc.cadn.net.cn

Zookeeper 配置将尝试从四个自动上下文加载值,这基于spring.cloud.zookeeper.config.name(默认为spring.application.name属性的值)和spring.cloud.zookeeper.config.default-context(默认为application)。如果您希望指定上下文而不是使用计算得到的上下文,则可以将此信息添加到spring.config.import语句中。spring-doc.cadn.net.cn

application.properties
spring.config.import=optional:zookeeper:myhost:2181/contextone;/context/two

这将可选地仅从 /contextone/context/two 加载配置。spring-doc.cadn.net.cn

使用 Spring Boot 配置数据导入方法时,无需 bootstrap 文件(属性文件或 YAML 文件)即可通过 spring.config.import 进行导入。

8.3. 自定义

Zookeeper 配置可以通过设置以下属性来自定义:spring-doc.cadn.net.cn

spring:
  cloud:
    zookeeper:
      config:
        enabled: true
        root: configuration
        defaultContext: apps
        profileSeparator: '::'
如果您已设置 spring.cloud.bootstrap.enabled=truespring.config.use-legacy-processing=true,或包含 spring-cloud-starter-bootstrap,则上述值需放置在 bootstrap.yml 中,而非 application.yml

8.4. 访问控制列表(ACLs)

您可以调用 addAuthInfo 类型的 CuratorFramework Bean 的 addAuthInfo 方法,为 Zookeeper ACL 提供身份验证信息。一种实现方法是提供自己的 CuratorFramework Bean,如下例所示:spring-doc.cadn.net.cn

@BoostrapConfiguration
public class CustomCuratorFrameworkConfig {

  @Bean
  public CuratorFramework curatorFramework() {
    CuratorFramework curator = new CuratorFramework();
    curator.addAuthInfo("digest", "user:password".getBytes());
    return curator;
  }

}

Consult the ZookeeperAutoConfiguration class to see how the CuratorFramework bean’s default configuration.spring-doc.cadn.net.cn

或者,您可以添加依赖于现有CuratorFramework Bean 的类中的凭据,如下例所示:spring-doc.cadn.net.cn

@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 属性值来注册这些配置类以在此阶段运行,如下例所示:spring-doc.cadn.net.cn

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