为什么要用配置中心
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 | /config/testApp,dev |
配置优先级是从上至下的。/config/application
会应用到所有使用zookeeper作配置中心的项目上,/config/testApp
只对应用名为testApp
的项目有效.
如何配置Spring Cloud Zookeeper Config
下面的例子是
引入依赖
1 | <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 | spring.cloud.zookeeper.config.enable=true |
不过没有特殊需要,不建议修改这些默认配置,原因下面会讲。
引用配置
引用配置方法跟放properties里的一样,用@Value或者 @ConfigurationProperties,只有在使用@ConfigurationProperties才能动态更新, @Value要重启后生效
1 | @Value("${key}") |
1 | @ConfigurationProperties(prefix = "test") |
图形化配置:
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 |