Spring cloud使用zookeeper作为分布式配置中心

为什么要用配置中心

Spring boot项目在启动时会加载application.properties(或yaml)里的配置,如果修改了application.properties,需要重新打包、部署,当服务有多个实例,需要每个都重新部署。配置中心就是用来解决这个问题的,我们所配置内容放在配置中心统一管理,项目启动时先去配置中心拉取配置,再用这些配置执行启动操作。如果配置有变更,在配置中心修改后,只需要一一重启服务,即可完成配置更新。有些配置中心甚至不需要重启,支持配置推送,比如我们今天介绍的Spring cloud zookeeper config。

Spring Cloud Zookeeper Config 介绍

Zookeeper提供了一个类似目录树的存储结构,允许客户端存储任意数据,如:配置数据。

Spring Cloud Zookeeper Config是Spring Cloud Config Server和Client的替代方案(这个方案需要起一个server服务,依赖git存储配置),在bootstrap阶段,加载配置到Spring环境中。

默认情况下,配置存储在/config节点下。Spring Cloud Zookeeper Config会基于应用程序名称和profile创建多个PropertySource模拟Spring Cloud Config顺序从Zookeeper读取并解析配置。

例如,应用名是testApp,profile是dev会创建下面几个property源:

1
2
3
4
/config/testApp,dev
/config/testApp
/config/application,dev
/config/application

配置优先级是从上至下的。/config/application 会应用到所有使用zookeeper作配置中心的项目上,/config/testApp 只对应用名为testApp的项目有效.

如何配置Spring Cloud Zookeeper Config

下面的例子是

引入依赖

1
2
3
4
5
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-config</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>

版本号跟你用的spring boot版本相关,2.1.x版本可以直接使用2.1.0.RELEASE,其他版本参考 https://spring.io/projects/spring-cloud

修改默认配置

上文提到Spring cloud zookeeper config默认配置存在/confi节点,默认读取/config/application配置,application和profile之间用逗号分割,这些都是可配置的。

resources目录下创建bootstrap.properties:

1
2
3
4
spring.cloud.zookeeper.config.enable=true
spring.cloud.zookeeper.config.root=config
spring.cloud.zookeeper.config.defaultContext=application
spring.cloud.zookeeper.config.profileSeparator=,

不过没有特殊需要,不建议修改这些默认配置,原因下面会讲。

引用配置

引用配置方法跟放properties里的一样,用@Value或者 @ConfigurationProperties,只有在使用@ConfigurationProperties才能动态更新, @Value要重启后生效

1
2
@Value("${key}")
String key;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@ConfigurationProperties(prefix = "test")
public class Test {
String key1;
String key2;

public String getKey1() {
return key1;
}

public void setKey1(String key1) {
this.key1 = key1;
}

public String getKey2() {
return key2;
}

public void setKey2(String key2) {
this.key2 = key2;
}
}

图形化配置:

Spring并没有提供一个图形化修改配置的工具,但有第三方解决方案。zookeeper-config-keeper

docker一键部署:

1
docker run  --name=zkck -p 80:80 -e jwtsecret=asdfwefasdf -e zookeeperaddress=192.168.2.103:2181 pocketdigi/zookeeper-config-keeper:v0.1

2019-9-2/20190902162610.png