5.Spring Boot 使用 Curator 操作 ZooKeeper「第三章 ZooKeeper Java客户端」「架构之路ZooKeeper理论和实战」
这一节我们来看下Spring Boot中如何使用Curaotor操作ZooKeeper。
一、Spring Boot 使用 Curator 操作 ZooKeeper
1.1 环境说明
(1)操作环境:Mac OS
(2)开发工具Idea
(3)ZooKeeper 服务端版本:3.6.2
(4)Spring Boot版本:2.4.4
(5)curator版本:5.1.0
1.2 操作步骤
在具体的实际操作之前,我们先捋一下思路,在java中使用Curator,核心的一个类就是CuratorFramework,所以我们只需要能够将类CuratorFramework注入到Spring中,那么就能够对节点进行操作了。
对于如何注入CuratorFramework的话,我们有两种思路:
(1)找到一个curator的starter,在这个starter就已经注入了CuratorFramework,我们直接使用即可:能找到这个方式是最简单的,但既然没有找到相应的starter,难道是我的姿势不对?
(2)我们自己使用@Bean注入CuratorFramework。
本文主要使用第(2)种方式进行展开讲解,如果有找到相应的starter的,记得给我留言哦。
对于第二种方式,来看下具体需要的步骤:
(1)创建一个spring boot项目:使用idea创建一个spring boot项目;
(2)引入依赖包:核心就是curator-recipes;
(3)在application.properties文件编写配置信息:这里我们将连接zk的参数放到配置文件进行管理。
(4)编写一个配置信息对应的配置信息类,比如ZooKeeperProperties:对应在配置类编写的配置信息。
(5)编写一个配置类ZooKeeperConfig,这个类核心就是注入CuratorFramework。
接下里我们就根据这个操作说明来看下具体要怎么操作。
1.3 新建项目
使用idea新建一个项目,比如取名为:springboot-curator-demo
1.4 添加依赖
在pom.xml文件添加一些包:curator-recipes(curator的核心依赖包)、spring-boot-configuration-processor(@ConfigurationProperties在这个包里),具体的pom.xml文件如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.4.4</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <groupId>com.kfit</groupId>
- <artifactId>springboot-curator-demo</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <name>springboot-curator-demo</name>
- <description>Demo project for Spring Boot</description>
-
- <properties>
- <java.version>1.8</java.version>
- </properties>
-
- <dependencies>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
-
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-configuration-processor</artifactId>
- <version>RELEASE</version>
- </dependency>
-
- <dependency>
- <groupId>org.apache.curator</groupId>
- <artifactId>curator-recipes</artifactId>
- <version>5.1.0</version>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
-
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
-
- </project>
1.5 配置信息
在application.properties配置连接zk server的一些信息,比如地址、超时时间等等:
-
- #服务器地址
- zookeeper.connectString=127.0.0.1:2181
- #命名空间,被称为ZNode
- zookeeper.namespace=curator
- #会话超时时间,默认值为:60000
- zookeeper.sessionTimeoutMs=60000
- #连接超时时间,默认值为:15000
- zookeeper.connectionTimeoutMs=15000
- #重试之间等待的初始时间
- zookeeper.baseSleepTimeMs=1000
- #重试的最大次数
- zookeeper.maxRetries=3
1.6 配置信息类
配置信息对应的配置类,熟悉Spring Boot的想必不会陌生:
- package com.kfit.springbootcuratordemo.curator;
- import org.springframework.boot.context.properties.ConfigurationProperties;
- import org.springframework.context.annotation.Configuration;
-
- /**
- * 连接zk server的配置信息,在application.properties进行配置。
- *
- * @author 悟纤「公众号SpringBoot」
- * @date 2021-03-23
- * @slogan 大道至简 悟在天成
- */
- //不需要配置:@Component,在@Configuration已经包括了,无需多此一举。
- //@Component
- //注明这是一个配置文件
- @Configuration
- // 配置文件信息前缀
- @ConfigurationProperties(prefix = "zookeeper")
- public class ZooKeeperProperties {
- private String connectString;
- private String namespace;
- private int sessionTimeoutMs=60000;
- private int connectionTimeoutMs=15000;
- private int baseSleepTimeMs=1000;
- private int maxRetries=3;
-
- public int getSessionTimeoutMs() {
- return sessionTimeoutMs;
- }
-
- public void setSessionTimeoutMs(int sessionTimeoutMs) {
- this.sessionTimeoutMs = sessionTimeoutMs;
- }
-
- public int getConnectionTimeoutMs() {
- return connectionTimeoutMs;
- }
-
- public void setConnectionTimeoutMs(int connectionTimeoutMs) {
- this.connectionTimeoutMs = connectionTimeoutMs;
- }
-
- public int getBaseSleepTimeMs() {
- return baseSleepTimeMs;
- }
-
- public void setBaseSleepTimeMs(int baseSleepTimeMs) {
- this.baseSleepTimeMs = baseSleepTimeMs;
- }
-
- public int getMaxRetries() {
- return maxRetries;
- }
-
- public void setMaxRetries(int maxRetries) {
- this.maxRetries = maxRetries;
- }
-
- public String getConnectString() {
- return connectString;
- }
-
- public void setConnectString(String connectString) {
- this.connectString = connectString;
- }
-
- public String getNamespace() {
- return namespace;
- }
-
- public void setNamespace(String namespace) {
- this.namespace = namespace;
- }
- }
1.7 配置类
编写注入CuratorFramework的配置类:
- package com.kfit.springbootcuratordemo.curator;
-
- import org.apache.curator.RetryPolicy;
- import org.apache.curator.framework.CuratorFramework;
- import org.apache.curator.framework.CuratorFrameworkFactory;
- import org.apache.curator.framework.state.ConnectionState;
- import org.apache.curator.framework.state.ConnectionStateListener;
- import org.apache.curator.retry.ExponentialBackoffRetry;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
-
- /**
- * 注入Curator的CuratorFramework
- *
- * @author 悟纤「公众号SpringBoot」
- * @date 2021-03-23
- * @slogan 大道至简 悟在天成
- */
- @Configuration
- public class ZooKeeperConfig {
- @Autowired
- private ZooKeeperProperties zooKeeperProperties;
-
- @Bean
- public CuratorFramework curatorFramework(){
- /*
- 方式二:
- * connectionString zk地址
- * sessionTimeoutMs 会话超时时间
- * connectionTimeoutMs 连接超时时间
- * namespace 每个curatorFramework 可以设置一个独立的命名空间,之后操作都是基于该命名空间,
比如操作 /user/message 其实操作的是/curator/user/message - * retryPolicy 重试策略
- */
- String connectString = zooKeeperProperties.getConnectString();
- //集群的情况下,多个地址使用逗号分隔:
- //String connectString = "127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183,127.0.0.1:2184";
-
-
- RetryPolicy retryPolicy = new ExponentialBackoffRetry(zooKeeperProperties.getBaseSleepTimeMs(),
zooKeeperProperties.getMaxRetries()); - CuratorFramework curatorFramework = CuratorFrameworkFactory.builder()
- .connectString(connectString)
- .sessionTimeoutMs(zooKeeperProperties.getSessionTimeoutMs())
- .connectionTimeoutMs(zooKeeperProperties.getConnectionTimeoutMs())
- .namespace(zooKeeperProperties.getNamespace())
- .retryPolicy(retryPolicy)
- .build();
-
- curatorFramework.getConnectionStateListenable().addListener(new ConnectionStateListener() {
- @Override
- public void stateChanged(CuratorFramework client, ConnectionState newState) {
- if(newState == ConnectionState.CONNECTED){
- System.out.println("连接成功!");
- }
- }
- });
-
- curatorFramework.start();
- return curatorFramework;
- }
-
- }
1.8 使用
这时候我们可以在别的类中使用@Autowired注入CuratorFramework,对于具体的使用和我们前面两节讲的就一样,这里就不重复进行讲解了,不懂的可以看前面的两个小小节。
1.9 zookeeper 8080端口管理功能
3.5版本后增加管理接口,默认8080,有可能与本机tomcat冲突而造成启动失败
在zoo.conf增加一行配置来修改默认配置即可:
admin.serverPort=12181
管理接口访问:http://127.0.0.1:12181/commands/stats
二、小结
对于如何注入CuratorFramework的话,我们有两种思路:
(1)找到一个curator的starter,在这个starter就已经注入了CuratorFramework,我们直接使用即可:能找到这个方式是最简单的,但既然没有找到相应的starter,难道是我的姿势不对?
(2)我们自己使用@Bean注入CuratorFramework。
本文主要使用第(2)种方式进行展开讲解,如果有找到相应的starter的,记得给我留言哦。
对于第二种方式,来看下具体需要的步骤:
(1)创建一个spring boot项目:使用idea创建一个spring boot项目;
(2)引入依赖包:核心就是curator-recipes;
(3)在application.properties文件编写配置信息:这里我们将连接zk的参数放到配置文件进行管理。
(4)编写一个配置信息对应的配置信息类,比如ZooKeeperProperties:对应在配置类编写的配置信息。
(5)编写一个配置类ZooKeeperConfig,这个类核心就是注入CuratorFramework。
购买完整视频,请前往:http://www.mark-to-win.com/TeacherV2.html?id=287