8. 使用Zookeeper的分布式配置
Zookeeper提供了一个 层次化的命名空间 ,让客户端可以存储任意数据,如配置数据。Spring Cloud Zookeeper Config是Config Server和Client的替代方案。 配置在特殊的“bootstrap”阶段加载到Spring Environment中。默认情况下,配置存储在/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 支持)来实现。
8.1. 激活
Including a dependency on
org.springframework.cloud:spring-cloud-starter-zookeeper-config enables
autoconfiguration that sets up Spring Cloud Zookeeper Config.
| 在使用 Zookeeper 版本 3.4 时,需要更改 包含依赖的方式,如在 此处 所描述。 |
8.2. Spring Boot 配置数据导入
Spring Boot 2.4 引入了一种通过 spring.config.import 属性导入配置数据的新方式。这种方式现在是从 Zookeeper获取配置的默认方式。
可选地通过在 application.properties 中设置以下内容连接到 Zookeeper 以进行配置:
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属性中的导入位置优先于connect-string属性。
Zookeeper 配置将尝试从四个自动上下文加载值,这基于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 Boot 配置数据导入方法时,无需 bootstrap 文件(属性文件或 YAML 文件)即可通过 spring.config.import 进行导入。 |
8.3. 自定义
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。 |
8.4. 访问控制列表(ACLs)
您可以调用 addAuthInfo 类型的 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;
}
}
Consult the ZookeeperAutoConfiguration class to see how the CuratorFramework bean’s default configuration.
或者,您可以添加依赖于现有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