SpringBoot整合ZooKeeper完整教程

news2024/10/7 8:20:39

目录

ZooKeeper简单介绍

 一、安装zookeeper

二、springboot整合zookeeper


ZooKeeper简单介绍

zookeeper是为分布式应用程序提供的高性能协调服务。zookeeper将命名、配置管理、同步和组服务等常用服务公开在一个简单的接口中,因此用户无需从头开始编写这些服务。可以使用它来实现共识、组管理、领导者选举和存在协议。还可以在此基础上满足自己的特定需求。开始学习zookeeper:zookeeper官网

zookeeper和nacos、eureka、consul都是我们常见的微服务注册中心,这篇文章就详细地介绍一下springboot整合zookeeper的步骤。

 一、安装zookeeper

为了方便使用zookeeper,我们在windows系统上安装zookeeper。

首先,需要下载zookeeper,点击链接打开zookeeper官网Apache ZooKeeper,在官网首页点击Getting Started下面的Download进入下载页面

 选择下载稳定的版本

 下载完成后,解压到D盘,然后打开刚刚解压的zookeeper安装目录下的config目录,复制一份zoo_sample.cfg,然后重命名为zoo.cfg,修改里面的内容,dataLogDir是新增的,原来文件里没有

dataDir:zookeeper的安装目录\\data

dataLogDir:zookeeper的安装目录\\log

tickTime=2000

initLimit=10

syncLimit=5

clientPort=2181

dataDir=D:\\program\\apache-zookeeper-3.7.1\\data

dataLogDir=D:\\program\\apache-zookeeper-3.7.1\\log

然后在安装目录下新建两个目录data和log

经过以上的步骤,zookeeper就算安装完了。

二、springboot整合zookeeper

1、在IntelliJ IDEA里新建一个springboot项目,命名为zookeeper

2、在项目的pom.xml文件中引入zookeeper和相关依赖

<?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.5.9</version>
        <relativePath/>
    </parent>

    <groupId>com.example</groupId>
    <artifactId>zookeeper</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <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>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.22</version>
        </dependency>

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.7.0</version>
        </dependency>

        <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>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

3、修改application.xml配置文件,只需要指定项目启动端口号和zookeeper的服务器地址

server:
  port: 8085

zookeeper:
  host: localhost:2181

4、项目根目录下创建config包,新建一个zookeeper的配置类

package com.example.zookeeper.config;

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

/**
 * @author heyunlin
 * @version 1.0
 */
@Configuration
public class ZookeeperConfig {
    @Value("${zookeeper.host}")
    private String host;

    @Bean
    public CuratorFramework curatorFramework() {
        CuratorFramework curatorFramework = CuratorFrameworkFactory.builder()
                .connectString(host)
                .sessionTimeoutMs(5000)
                .retryPolicy(new ExponentialBackoffRetry(500, 5))
                .build();
        curatorFramework.start();

        return curatorFramework;
    }

}

5、使用zookeeper的API

package com.example.zookeeper.controller;

import com.example.zookeeper.restful.JsonResult;
import org.apache.curator.framework.CuratorFramework;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import java.nio.charset.StandardCharsets;
import java.util.List;

/**
 * @author heyunlin
 * @version 1.0
 */
@RestController
@RequestMapping(path = "/zookeeper", produces = "application/json;charset=utf-8")
public class ZookeeperController {
    private final CuratorFramework curatorFramework;

    @Autowired
    public ZookeeperController(CuratorFramework curatorFramework) {
        this.curatorFramework = curatorFramework;
    }

    /**
     * 判断znode是否存在
     * @param node 节点名称
     */
    @RequestMapping(value = "/exist", method = RequestMethod.GET)
    public JsonResult<Stat> exist(String node) throws Exception {
        Stat stat = curatorFramework.checkExists().forPath(node);

        return JsonResult.success(null, stat);
    }

    /**
     * 创建一个znode
     * @param node 节点名称
     */
    @RequestMapping(value = "/create", method = RequestMethod.GET)
    public JsonResult<Void> create(String node) throws Exception {
        curatorFramework.create()
                .creatingParentContainersIfNeeded()
                /*
                创建模式:常用的有
                    PERSISTENT:持久化节点,客户端与zookeeper断开连接后,该节点依旧存在,只要不手动删除,该节点就会永远存在。
                    PERSISTENT_SEQUENTIAL:持久化顺序编号目录节点,客户端与zookeeper断开连接后,该节点依旧存在,只是zookeeper给该节点名称进行顺序编号。
                    EPHEMERAL:临时目录节点,客户端与zookeeper断开连接后,该节点被删除。
                    EPHEMERAL_SEQUENTIAL:临时顺序编号目录节点,客户端与zookeeper断开连接后,该节点被删除,只是zookeeper给该节点名称进行顺序编号。
                */
                .withMode(CreateMode.EPHEMERAL)
                .forPath(node);

        return JsonResult.success("创建成功");
    }

    /**
     * 设置znode节点的数据
     * @param node 节点名称
     * @param data 节点的数据
     */
    @RequestMapping(value = "/setData", method = RequestMethod.GET)
    public JsonResult<Void> setData(String node, String data) throws Exception {
        curatorFramework.setData().forPath(node, data.getBytes(StandardCharsets.UTF_8));

        return JsonResult.success("设置成功");
    }

    /**
     * 删除节点
     * @param node 节点名称
     */
    @RequestMapping(value = "/delete", method = RequestMethod.GET)
    public JsonResult<Void> delete(String node) throws Exception {
        curatorFramework.delete().forPath(node);

        return JsonResult.success("删除成功");
    }

    /**
     * 删除节点及其子节点的数据
     * @param node 节点名称
     */
    @RequestMapping(value = "/deleteDeeply", method = RequestMethod.GET)
    public JsonResult<Void> deleteDeeply(String node) throws Exception {
        curatorFramework.delete().deletingChildrenIfNeeded().forPath(node);

        return JsonResult.success("删除成功");
    }

    /**
     * 获取节点的数据
     * @param node 节点名称
     */
    @RequestMapping(value = "/getData", method = RequestMethod.GET)
    public JsonResult<String> getData(String node) throws Exception {
        byte[] bytes = curatorFramework.getData().forPath(node);

        return JsonResult.success(null, new String(bytes));
    }

    /**
     * 获取当前节点的子节点数据
     * @param node 节点名称
     */
    @RequestMapping(value = "/getChildren", method = RequestMethod.GET)
    public JsonResult<List<String>> getChildren(String node) throws Exception {
        List<String> list = curatorFramework.getChildren().forPath(node);

        return JsonResult.success(null, list);
    }

}

参考文章:

https://blog.csdn.net/weixin_43741092/article/details/118721325

https://blog.csdn.net/weixin_43741092/article/details/118721325

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/747730.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SpringBoot3】--03.数据访问、基础特性(外部化和内部外配置、整合JUnit)

文章目录 SpringBoot3-数据访问1.整合SSM场景1.1创建SSM整合项目1.2配置数据源1.3配置MyBatis1.4CRUD编写 2.自动配置原理3.扩展&#xff1a;整合其他数据源3.1 Druid 数据源 SpringBoot3-基础特性1. SpringApplication1.1 自定义 banner1.2.自定义 SpringApplication1.3Fluent…

【ELK企业级日志分析系统】部署Filebeat+ELK详解

部署FilebeatELK详解 1. 部署Filebeat节点1.1 部署Apache服务1.2 部署Filebeat服务 2. filter插件2.1 grok正则捕获插件2.1.1 内置正则表达式调用2.1.2 自定义表达式调用2.1.3 设置正则表达式过滤条件 2.2 mutate数据修改插件2.2.1 Mutate过滤器常用的配置选项2.2.2 Mutate过滤…

ROS2学习(一 、ROS2安装)

ROS2官方安装 https://docs.ros.org/en/galactic/Installation/Ubuntu-Install-Debians.html 本来想找一下和ros1一样的安装指导文档&#xff0c;可以根据自己的系统选择。不过没有找到一个直接的说明教程。 不过在ROS2的各个版本安装说明里面有写支持哪些版本的系统。 比如我…

AWS 中文入门开发教学 45- Cloud9 - Node.js的开发与调试

知识点 在 Cloud9 环境中开发调试 Node.js 应用程序实战演习 $ mkdir expressweb $ cd expressweb $ npm init -y $ npm install express --save $ nano app.js ... $ curl http://httpbin.org/ip #查看当前主机的ip地址 $ node app.jscloud9还提供了一个非常好用的debug工具:…

23款迈巴赫S480新提车升级头等舱行政四座,五座改四座案例改装

新款的迈巴赫S480五座改四座成了必改的配置&#xff0c;改装的车主非常的多&#xff0c;不仅提供宽大的空间&#xff0c;而且后排中央扶手马鞍处还增加了一块Pad&#xff0c;用来控制空调&#xff0c;遮阳帘等。更有一众黑科技提供的后排乘客的舒适性。一起来看看五座迈巴赫S48…

Android 学习笔记: 三种基本布局的使用介绍

一、概述 布局是一种可用于放置很多控件的容器&#xff0c;它可以按照一定的规律调整内部控件的位置&#xff0c;从而编写出精美的界面。 布局的内部除了放置控件外&#xff0c;也可以放置布局。 三种常用布局 LinearLayoutRelativeLayoutFrameLayout 二、 LinearLayout …

列举几个常用的淘宝API接口(详情页面数据接口,评论接口,关键词搜索接口,店铺所有商品接口)

目前各大电商平台都有自己的开放平台&#xff0c;通过API接口开放本电商平台的相关数据和功能&#xff0c;以自由开放的姿态来占领更多的市场份额。也让更多的人能来电商市场分得一杯羹。 下面列举几个常用的API接口&#xff0c;量大择优hui&#xff0c; 注册key和secret可测…

基于SpringBoot+Vue的校园博客系统设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

mysql将某一列的数据根据固定字符拆分后判断存不存在

如果数据库的某个字段在存储时是用的逗号分割&#xff0c;如下图所示&#xff1a; 例如这张表中有一个字段是用的逗号分割&#xff0c;其实这种设计违背了数据库三范式设计原则&#xff0c;如何判断这一列的值包不包含某一个值&#xff1f; 方法一 用mysql自带的字符串函数去判…

浅析路灯电击安全问题与选型

摘要&#xff1a;介绍了路灯设计安全防护的几个要点&#xff0c;简单分析了路灯低压配电接地系统形式TN-S和TT的选择及剩余电流保护装置在路灯设计中设置的必要性&#xff0c;列举了路灯灯具和灯杆的一些安全技术质量要求。 关键词&#xff1a;路灯配电系统接地形式&#xff1b…

ModaHub魔搭社区:AI原生云向量数据库Zilliz Cloud与 LangChain 集成搭建智能文档问答系统

目录 准备工作 主要参数 准备数据 开始提问 本文将演示如何使用 Zilliz Cloud 和 LangChain 搭建基于大语言模型(LLM)的问答系统。在本例中,我们将使用一个 1 CU 的 Cluster,还将使用 OpenAI 的 Embedding API 来获取指定文本的向量表示。现在就让我们开始吧。 准备工作…

谈谈对SpringMVC的理解

1、SpringMVC是属于SpringFramework生态里面的一个模块&#xff0c;它是在Servelet基础上构建的&#xff0c;并且使用了MVC模式设计的一个Web框架&#xff1b; 2、它的主要目的是为了简化传统模式下的Serveletjsp的开发模式&#xff0c;其次SpringMVC的架构模式是对于Java的web…

基于CrowdHuman数据集的高精度行人检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于CrowdHuman数据集的高精度行人检测系统可用于日常生活中检测与定位行人目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的行人目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练…

计组 第四章 错题

4.1 13 汇编指令能看到什么 II 体系结构没有变 小端法

# Java 并发编程的艺术(三)

Java 并发编程的艺术&#xff08;三&#xff09; 文章目录 Java 并发编程的艺术&#xff08;三&#xff09;Java 内存模型Java 内存模型的基础Java 内存模型的抽象结构从源代码到指令序列的重排序 重排序happens-beforeJMM 的设计happens-before 的定义 Java 中的锁Lock 接口代…

Java零基础入学,你应该了解什么

最近很多人问我想学Java但是一点基础没有&#xff0c;网上看了一堆学习线路图还是无从下手。今天耗时3小时整理了一套保姆级的Java入门教程&#xff0c;建议收藏按照线路图一点点学习。 一、Java的概况 Java是1995年6月美国Sun公司推出的计算机语言。Java支付是James Gosling…

java动态导出excel头

java动态导出excel头 java根据动态头导出excel文件一、需求背景1、调用接口将表头传给给后端2、请求结果展示3、核心代码1、工具类&#xff0c;注意异常抛出类如报错&#xff0c;需自定义异常类2、标题设置类3、单元各简单设置类4、controller接收参数 java根据动态头导出excel…

大势Inside |《倾斜摄影测量实景三维建模技术规程》发布

2023年6月21日&#xff0c;由广西壮族自治区自然资源产品质量检验中心、广西科学院、武汉大学提出&#xff0c;武汉大势智慧科技有限公司、武汉大学、广西科学院等27家单位起草的广西人工智能学会团体标准《倾斜摄影测量实景三维建模技术规程》正式发布。 此前&#xff0c;广西…

今天给大家分享几款非常实用的小工具

在当今数字化的时代&#xff0c;我们离不开各种智能设备和应用程序。然而&#xff0c;有时候我们可能会感到需要一些简单而实用的小工具来帮助我们更高效地完成日常任务或提升生活品质。今天我将与大家分享几款非常实用的小工具&#xff0c;这些工具可以在我们的生活中发挥积极…

Vue3+ElementPlus el-tree递归获取当前选中节点的所有子节点ID (适用所有场景)

点击节点触发两遍此方法问题 将@check-change改成@check即可~ 然后说下选中当前节点去获取其节点下的所有子节点的ID问题,网上搜了许多没有合适自己的方法,项目需求是单选,用了父子不关联的方法实现的单选,需要做下控制就是父节点不允许点击的情况下的子节点也不允许点击…