华丽的跌落,胜过无谓的徘徊
zookeeper作为一个分布式协调框架,其中的( Node结点+Watch机制 )的特性注定了它可以随意扩展新功能,是一款优秀的分布式协调组件。
zookeeper最常用的就是作为微服务开发的注册中心,实现分布式锁,leader选举等功能。在实际的额开发中,测试到zookeeper作为配置中心也是不错的选择。
本次测试使用的SpringCloud版本是2020版本,从命名上,Spring Cloud 废除了这种英国伦敦地铁站的命名方式,从而使用了全新的 “日历化” 版本命名方式,在功能实现和更新上也是有很大的突破。
准备工作:
zkui 作为zookeeper可视化操作界面,实现动态配置远程修改操作。
在下载的zkui资源中,有关于zkui配置的文件config.cfg
有2个重要的配置需要修改
//可视化界面访问端口
serverPort=9090
//zookeeper地址
zkServer=127.0.0.1:2181
//可视化界面登录的用户名和密码
userSet = {"users": [{ "username":"admin" , "password":"admin","role": "ADMIN" },{ "username":"appconfig" , "password":"appconfig","role": "USER" }]}
修改好后需要把修改的config.cfg文件重新打入jar包中
jar uvf zkui.jar config.cfg
启动zkui
java -jar zkui.jar
需要的 pom 文件如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
//springCloud2020.0.0-SNAPSHOT版本支持的Springboot版本是2.4.1以上
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--#解决bootstrap.properties配置文件在cloud2020版本中失效问题-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--actuator监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zookeeper-config</artifactId>
</dependency>
bootstrap.properties配置文件
#服务名
spring.application.name=config-demo
#ZooKeeper的连接字符串,如果是集群,逗号分隔节点,格式:ip:port[,ip2:port2,.....]
spring.cloud.zookeeper.connect-string=127.0.0.1:2181
#指定zookeeper目录的根目录
spring.cloud.zookeeper.config.root=config
#启用zk的配置
spring.cloud.zookeeper.config.enabled=true
注意:目前配置的配置文件保存节点是:/config/config-demo/…
这个目录需要自己手动创建。
可以创建的节点有三种类型:
- application
- config-demo
- config-demo,dev(服务名+英文逗号+环境id)
第三种的环境id可配置在pom文件中,详情移步Springboot结合Maven的profiles标签实现多环境配置
三个节点中都可以保存配置文件,不过优先级不同。
config-demo,dev > config-demo > application
注意:
什么情况会动态加载?
1.静态加载:配置数据库连接,redis连接等这些配置属于静态加载,系统启动就加载进去,当用zookeeper进行后置修改时,没任何影响。比如使用注解 @Value(${xxx}) 获取配置文件参数时虽然在zookeeper修改了但获取的还是系统刚启动按照优先级加载的值。
2.动态修改:
使用注解 @ConfigurationProperties
@ConfigurationProperties(prefix = "aaa")
@Component
public class AAA {
private String bbb;
public String getBbb() {
return bbb;
}
public void setBbb(String bbb) {
this.bbb = bbb;
}
}