分布式配置与 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 支持此功能)也是可用的。
激活
包含 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 中设置以下内容:
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
语句中。
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=true 或 spring.config.use-legacy-processing=true ,或者包含了 spring-cloud-starter-bootstrap ,则上述值需要放在 bootstrap.yml 中而不是 application.yml 中。 |
访问控制列表 (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 类 以查看 CuratorFramework
Bean 的默认配置。
或者,您可以从依赖于现有 CuratorFramework
Bean 的类中添加凭证,如以下示例所示:
@BoostrapConfiguration
public class DefaultCuratorFrameworkConfig {
public ZookeeperConfig(CuratorFramework curator) {
curator.addAuthInfo("digest", "user:password".getBytes());
}
}
此 Bean 的创建必须在 bootstrapping 阶段进行。您可以通过使用 @BootstrapConfiguration
注解配置类并在 resources/META-INF/spring.factories
文件中将它们包含在以逗号分隔的列表中,并将该列表设置为 org.springframework.cloud.bootstrap.BootstrapConfiguration
属性的值,如以下示例所示:
org.springframework.cloud.bootstrap.BootstrapConfiguration=\ my.project.CustomCuratorFrameworkConfig,\ my.project.DefaultCuratorFrameworkConfig