Spring Boot 使用 Curator 操作 ZooKeeper

求知探索 1年前 ⋅ 834 阅读

一、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。

 


全部评论: 0

    我有话说: