Zookeeper提供了一个分层的命名空间,让客户端可以存储任意数据,例如配置数据。Spring Cloud Zookeeper Config是Config Server和Client的替代方案。在特殊的“bootstrap”阶段,配置被加载到Spring环境中。默认情况下,配置存储在/config命名空间中。将根据应用程序的名称和活动配置文件创建多个PropertySource实例,以模拟解析属性的Spring Cloud Config顺序。例如,一个名为testApp、具有dev配置文件的应用程序为其创建了以下属性源:
config/testApp,dev
config/testApp
config/application,dev
config/application
最具体的属性源在顶部,最不具体的在底部。config/application命名空间中的属性应用于所有使用zookeeper进行配置的应用程序。config/testApp命名空间中的属性仅可用于名为testApp的服务实例。通用配置放在config/application,testApp服务私有的配置放在config/testApp下。
要使用zookeeper作为配置中心,只需加入依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
spring-cloud-starter-bootstrap依赖是为了使用bootstrap.properties。配置bootstrap.properties:
server.port=8002
spring.application.name=producer
spring.cloud.zookeeper.connect-string=localhost:2181
spring.profiles.active=dev
连接上zookeeper服务后,运行create /config/producer,dev
创建producer,dev
节点,producer是服务名,dev是激活环境,以逗号分隔。继续运行create /config/producer,dev/myValue 123
在producer服务下加入配置myValue=123。
在Producer的Controller加入:
@Value("${myValue}")
private String myValue;
@RequestMapping("/myValue")
public String getMyValue(){
return myValue;
}
启动GatewayServer和Producer,访问http://localhost:8500/producer/myValue,看到123。
连接Zookeeper服务后,运行set /config/producer,dev/myValue 12345
改变myValue的值为12345。访问http://localhost:8500/producer/myValue,还是看到123。更改配置后看到的是原来的配置。
在Controller上加@RefreshScope,重启,访问http://localhost:8500/producer/myValue,看到12345。运行set /config/producer,dev/myValue 123456
改变myValue的值为123456,访问http://localhost:8500/producer/myValue,看到123456。加上@RefreshScope后修改配置会自动刷新。
在bootstrap.properties增加以下配置:
spring.cloud.zookeeper.config.root=configuration
spring.cloud.zookeeper.config.defaultContext=apps
spring.cloud.zookeeper.config.profileSeparator=::
root是改变存储配置的根节点。defaultContext是配置所有服务的配置的根节点。profileSeparator是服务名跟环境的分隔符。重新启动Producer发现报错,提示
Could not resolve placeholder 'myValue' in value "${myValue}"
找不到配置myValue。
连接上Zookeeper后运行create /configuration
创建配置根节点。继续运行create /configuration/producer::dev
创建Producer服务,运行create /configuration/producer::dev/myValue 456
设置myValue的值为456。启动Producer并访问http://localhost:8500/producer/myValue,看到456