关历史文章(阅读本文前,您可能需要先看下之前的系列👇

国内最全的Spring Boot系列之四

享元模式:共享女友 - 第355篇

什么是 ZooKeeper - 第347篇

ZooKeeper安装 - 第348篇

ZooKeeper数据结构和实操  - 第349篇

ZooKeeper的watch机制 - 第350篇

ZooKeeper的acl权限控制  - 第351篇

ZooKeeper内存数据和持久化  - 第352篇

ZooKeeper集群搭建 - 第354篇

ZooKeeper Java客户端的基本使用 - 第356篇

ZooKeeper客户端Curator - 第358篇

ZooKeeper客户端Curator的进阶使用 - 第359篇

ZooKeeper客户端Curator实现Watch事件监听 - 第361篇

Spring Boot 使用 Curator 操作 ZooKeeper - 第363篇

Spring Boot使用Apache Curator实现服务的注册和发现 - 第364篇
Spring Boot使用Apache Curator实现分布式锁(可重入排它锁) - 第365篇

Spring Boot使用Apache Curator实现leader选举 - 第366篇

Spring Boot使用Apache Curator实现分布式计数器 - 367篇

ZooKeeper Session 基本原理 - 第369篇

ZooKeeper分桶策略实现高性能的会话管理 - 第371篇

ZooKeeper集群架构以及读写原理 - 第372篇

ZooKeeper Leader选举原理也不过如此,看完这篇你不再懵逼了 - 第374篇

Zookeeper 集群节点为什么要部署成奇数呢?- 第376篇

ZooKeeper集群脑裂问题 - 第379篇

分布式一致性算法Paxos,ZooKeeper的ZAB协议 - 第381篇

 

这一节我们来看下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。

我就是我,是颜色不一样的烟火。
我就是我,是与众不同的小苹果。

à悟空学院:悟空学院

学院中有Spring Boot相关的课程!!

SpringBoot视频:从零开始学Spring Boot Plus - 网易云课堂

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringSecurity5.0视频:权限管理spring security - 网易云课堂

ShardingJDBC分库分表:分库分表Sharding-JDBC实战 - 网易云课堂

分布式事务解决方案:分布式事务解决方案「手写代码」 - 网易云课堂

JVM内存模型调优实战:深入理解JVM内存模型/调优实战 - 网易云课堂

Spring入门到精通:Spring零基础从入门到精通 - 网易云课堂

大话设计模式之爱你:大话设计模式之爱你一万年 - 网易云课堂

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐