一、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。
注意:本文归作者所有,未经作者允许,不得转载