使用 Zookeeper 进行分布式配置

Zookeeper 提供了一个 分层命名空间,允许客户端存储任意数据,例如配置数据。Spring Cloud Zookeeper Config 是 配置服务器和客户端 的替代方案。配置在特殊的“引导”阶段加载到 Spring 环境中。默认情况下,配置存储在 /config 命名空间中。根据应用程序的名称和活动配置文件创建多个 PropertySource 实例,以模仿 Spring Cloud Config 解析属性的顺序。例如,对于名为 testApp 且带有 dev 配置文件的应用程序,会为其创建以下属性源:

  • config/testApp,dev

  • config/testApp

  • config/application,dev

  • config/application

最具体的属性源在顶部,最不具体的在底部。config/application 命名空间中的属性适用于所有使用 Zookeeper 进行配置的应用程序。config/testApp 命名空间中的属性仅对名为 testApp 的服务实例可用。

配置当前在应用程序启动时读取。向 /refresh 发送 HTTP POST 请求会导致配置重新加载。还支持监视配置命名空间(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 中进行如下设置:

application.properties
spring.config.import=optional:zookeeper:

这将连接到默认位置“localhost:2181”的 Zookeeper。如果无法连接到 Zookeeper,删除 optional: 前缀将导致 Zookeeper Config 失败。要更改 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文件(properties或yaml)。

自定义

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

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

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

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

  • profileSeparator:设置用于分隔带配置文件的属性源中配置文件名称的分隔符的值。

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

访问控制列表 (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;
  }

}

请查阅 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 属性的值,如以下示例所示,在引导阶段运行配置类:

resources/META-INF/spring.factories
org.springframework.cloud.bootstrap.BootstrapConfiguration=\
my.project.CustomCuratorFrameworkConfig,\
my.project.DefaultCuratorFrameworkConfig
© . This site is unofficial and not affiliated with VMware.