Spring Boot整合Zookeeper详细教程

注意我这里用的是官方最稳定的版本3.7.1,版本之间有个别命令是有差距的!

本篇文章的示例SpringBoot和Zookeeper客户端以及zookeeper都是最新版本!

1.Curator介绍

Curator是Netflix公司开源的⼀套zookeeper客户端框架,Curator是对Zookeeper⽀持最好的客户端框架。Curator封装了⼤部分Zookeeper的功能,⽐如Leader选举、分布式锁等,减少了技术⼈员在使⽤Zookeeper时的底层细节开发⼯作。

2.创建springboot项目

在这里插入图片描述

3.引⼊Curator

<?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.7.0</version>
		<relativePath/>
	</parent>
	<groupId>com.gzl.cn</groupId>
	<artifactId>spring-boot-curator-zk</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>spring-boot-curator-zk</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-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

        <!--Curator-->
		<dependency>
			<groupId>org.apache.curator</groupId>
			<artifactId>curator-framework</artifactId>
			<version>5.2.1</version>
		</dependency>
		 <dependency>
			<groupId>org.apache.curator</groupId>
			<artifactId>curator-recipes</artifactId>
			<version>5.2.1</version>
		</dependency>
        <!--Zookeeper-->
        <dependency>
			<groupId>org.apache.zookeeper</groupId>
			<artifactId>zookeeper</artifactId>
			<version>3.8.0</version>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.18.22</version>
			<scope>provided</scope>
		</dependency>

		<!--解决Spring Boot Configuration Annotation Processor not configured提示问题-->
		<dependency>
			 <groupId>org.springframework.boot</groupId>
			 <artifactId>spring-boot-configuration-processor</artifactId>
			 <optional>true</optional>
		</dependency>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<scope>4.12</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-resources-plugin</artifactId>
				<version>3.1.0</version>
			</plugin>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

4.application.yml配置⽂件

application.yml和application.properties是都可以的,只不过他们的格式不一样。

curator:
  #重试retryCount次,当会话超时出现后,curator会每间隔elapsedTimeMs毫秒时间重试一次,共重试retryCount次。
  retryCount: 5
  elapsedTimeMs: 5000
  #服务器信息
  connectString: 127.0.0.1:2181
  #会话超时时间设置
  sessionTimeoutMs: 60000
  #连接超时时间
  connectionTimeoutMs: 5000

5.读取配置⽂件注入到容器

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

@Data
@Component
@ConfigurationProperties(prefix = "curator")
public class WrapperZK {
    private int retryCount;
    private int elapsedTimeMs;
    private String connectString;
    private int sessionTimeoutMs;
    private int connectionTimeoutMs;
}

6.注⼊CuratorFramework

import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.RetryNTimes;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CuratorConfig {
    @Autowired
    WrapperZK wrapperZk;

    /**
     * 这里的start就是创建完对象放到容器后,需要调用他的start方法
     *
     * @return
     */
    @Bean(initMethod = "start")
    public CuratorFramework curatorFramework() {
        return CuratorFrameworkFactory.newClient(
                wrapperZk.getConnectString(),
                wrapperZk.getSessionTimeoutMs(),
                wrapperZk.getConnectionTimeoutMs(),
                new RetryNTimes(wrapperZk.getRetryCount(), wrapperZk.getElapsedTimeMs()));
    }
}

7.添加测试方法

在这里添加测试方法即可!

在这里插入图片描述

import org.apache.curator.framework.CuratorFramework;
import org.apache.zookeeper.CreateMode;
import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringBootCuratorZkApplication.class)
class SpringBootCuratorZkApplicationTests {

    @Autowired
    CuratorFramework curatorFramework;

    /**
     * 创建节点
     *
     * @throws Exception
     */
    @Test
    void createNode() throws Exception {
        // 添加持久节点
        String path = curatorFramework.create().forPath("/curator-node");
        System.out.println(String.format("curator create node :%s successfully.", path));

        // 添加临时序号节点,并赋值数据
        String path1 = curatorFramework.create()
                .withMode(CreateMode.EPHEMERAL_SEQUENTIAL)
                .forPath("/curator-node", "some-data".getBytes());
        System.out.println(String.format("curator create node :%s successfully.", path));

        // System.in.read()目的是阻塞客户端关闭,我们可以在这期间查看zk的临时序号节点
        // 当程序结束时候也就是客户端关闭的时候,临时序号节点会消失
        System.in.read();
    }

    /**
     * 获取节点
     *
     * @throws Exception
     */
    @Test
    public void testGetData() throws Exception {
        // 在上面的方法执行后,创建了curator-node节点,但是我们并没有显示的去赋值
        // 通过这个方法去获取节点的值会发现,当我们通过Java客户端创建节点不赋值的话默认就是存储的创建节点的ip
        byte[] bytes = curatorFramework.getData().forPath("/curator-node");
        System.out.println(new String(bytes));
    }

    /**
     * 修改节点数据
     *
     * @throws Exception
     */
    @Test
    public void testSetData() throws Exception {
        curatorFramework.setData().forPath("/curator-node", "changed!".getBytes());
        byte[] bytes = curatorFramework.getData().forPath("/curator-node");
        System.out.println(new String(bytes));
    }

    /**
     * 创建节点同时创建⽗节点
     *
     * @throws Exception
     */
    @Test
    public void testCreateWithParent() throws Exception {
        String pathWithParent = "/node-parent/sub-node-1";
        String path = curatorFramework.create().creatingParentsIfNeeded().forPath(pathWithParent);
        System.out.println(String.format("curator create node :%s successfully.", path));
    }

    /**
     * 删除节点(包含子节点)
     *
     * @throws Exception
     */
    @Test
    public void testDelete() throws Exception {
        String pathWithParent = "/node-parent";
        curatorFramework.delete().guaranteed().deletingChildrenIfNeeded().forPath(pathWithParent);
    }
}

8.执行测试方法报错解决

在这里插入图片描述
上面那个闪电意思是install的时候跳过maven测试阶段,之所以要跳过测试阶段是因为假如不跳过他会验证测试方法,例如我们创建节点的方法,有时候我们节点已经创建了,但是他还会验证,所以就会报错。

在这里插入图片描述

源码地址:https://gitee.com/gzl_com/spring-cloud.git

  • 13
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
### 回答1: Spring Boot是一个开源的Java框架,用于快速构建独立的、可扩展的、基于生产级的Spring应用程序。它简化了Spring应用程序的配置和部署,并且提供了许多便利的特性,例如自动配置、内嵌服务器等。 Kafka是一个分布式的流处理平台,用于处理高容量的实时数据流。它使用发布-订阅的消息队列模式,可以有效地处理和存储大规模的数据流。Kafka提供了高吞吐量、持久性和容错性,适用于构建大规模的数据处理应用程序。 Zookeeper是一个分布式的协调服务,用于管理和协调大规模分布式系统的配置信息、命名服务、分布式同步和组服务等。它提供了可靠的数据存储,可以用于储存系统的元数据、配置信息等。Zookeeper还提供了分布式锁、选举、监控等功能,用于实现高可用和故障恢复能力。 Spring Boot集成了Kafka和Zookeeper,提供了方便的接口和功能,使得在Spring应用程序中使用Kafka和Zookeeper变得更加简单和高效。通过Spring Boot的自动配置,可以很容易地连接和配置Kafka和Zookeeper,并且可以方便地使用Kafka和Zookeeper的API进行消息的生产、消费和管理等操作。 总结来说,Spring Boot Kafka Zookeeper提供了一个全面的解决方案,用于构建分布式、高性能的数据处理应用程序。它使得开发者能够更加专注于业务逻辑的实现,而不用过多关注底层的配置和部署。通过使用Spring Boot Kafka Zookeeper,可以简化开发过程、提高开发效率,并且可以构建出高可伸缩、高可靠性的应用程序。 ### 回答2: Spring Boot是一个用于构建Java应用程序的开源框架,它提供了快速、方便和可重复使用的方式来开发基于Java的企业级应用程序。Kafka是一个分布式流处理平台,它可以用来构建高度可扩展的、实时的数据流应用程序。而Zookeeper是一个开源的分布式协调服务框架,它提供了一个分布式的、高可用性的系统,用于协调和管理大规模分布式应用程序的配置、命名服务和分布式锁等。 使用Spring Boot与Kafka和Zookeeper结合使用,可以构建高效且可伸缩的分布式应用程序。首先,Spring Boot可以通过提供简化的配置和自动化的依赖管理,简化Kafka和Zookeeper的集成过程。同时,Spring Boot还提供了许多与Kafka和Zookeeper交互的高级抽象,如KafkaTemplate用于发送和接收消息,以及CuratorFramework用于与Zookeeper进行交互。 使用Spring Boot与Kafka结合,可以实现实时的数据流处理。Kafka提供了可靠的、高吞吐量的消息传递,而Spring Boot通过提供简单的注解和配置,使得在应用程序中发送和接收消息变得非常容易。这种组合适用于实时分析、流媒体处理和事件驱动的应用程序等场景。 在与Zookeeper结合使用时,Spring Boot可以通过提供CuratorFramework的高级抽象,使得管理分布式应用程序的配置、命名服务和分布式锁等变得简单。Zookeeper可以作为底层的分布式系统,确保应用程序的高可用性和可靠性。 总而言之,Spring Boot与Kafka和Zookeeper的结合可以极大地简化分布式应用程序的开发和管理过程,减少了与底层技术的交互复杂性。它们提供了一种方便且可靠的方式来构建高性能、可伸缩和高可用性的分布式应用程序。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

怪 咖@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值