Spring Boot集成zookeeper快速入门Demo

1.什么是zookeeper?

Zookeeper 是一个开源的分布式协调服务,目前由 Apache 进行维护。Zookeeper 可以用于实现分布式系统中常见的发布/订阅、负载均衡、命令服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。它具有以下特性:

  • 顺序一致性:从一个客户端发起的事务请求,最终都会严格按照其发起顺序被应用到 Zookeeper 中;
  • 原子性:所有事务请求的处理结果在整个集群中所有机器上都是一致的;不存在部分机器应用了该事务,而另一部分没有应用的情况;
  • 单一视图:所有客户端看到的服务端数据模型都是一致的;
  • 可靠性:一旦服务端成功应用了一个事务,则其引起的改变会一直保留,直到被另外一个事务所更改;
  • 实时性:一旦一个事务被成功应用后,Zookeeper 可以保证客户端立即可以读取到这个事务变更后的最新状态的数据。

2.zookeeper环境搭建

docker-compose-zookeeper.yaml

version: '3'
services:zookeeper:image: zookeeper:3.7.0container_name: zookeeperrestart: unless-stoppedvolumes:- "./zookeeper/data:/data"- "./zookeeper/datalog:/datalog"ports:- "2181:2181"# webuizookeeper-webui:image: tobilg/zookeeper-webuicontainer_name: zookeeper-webuirestart: unless-stoppedenvironment:ZK_DEFAULT_NODE: zookeeper:2181depends_on:- zookeeperlinks:- zookeeperports:- "8089:8080"

run

docker-compose -f docker-compose-zookeeper.yml -p zookeeper up -d

可视化界面访问地址:[http://ip地址:8089] ,输入 [{宿主主机ip}:2181/]进入

桌面可视化工具PrettyZoo:  GitHub - vran-dev/PrettyZoo: 😉 Pretty nice Zookeeper GUI, Support Win / Mac / Linux Platform

3.代码工程

实验目标:实现在zookeeper创建节点

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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springboot-demo</artifactId><groupId>com.et</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>zookeeper</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- Apache Zookeeper--><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.14</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies>
</project>

zk配置类

package com.et.zookeeper.config;import lombok.extern.slf4j.Slf4j;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import java.util.concurrent.CountDownLatch;
import java.util.logging.Logger;@Configuration
@Slf4j
public class ZookeeperConfig {@Value("${zookeeper.address}")private String connectString;@Value("${zookeeper.timeout}")private int timeout;@Bean(name = "zkClient")public ZooKeeper zkClient() {ZooKeeper zooKeeper = null;try {final CountDownLatch countDownLatch = new CountDownLatch(1);//After the connection is successful, the watcher will be called back to monitor. This connection operation is asynchronous. After the new statement is executed, the subsequent code will be called directly.// Multiple service addresses can be specified: 127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183zooKeeper = new ZooKeeper(connectString, timeout, new Watcher() {@Overridepublic void process(WatchedEvent event) {if (Event.KeeperState.SyncConnected == event.getState()) {//If the response event from the server is received, the connection is successfulcountDownLatch.countDown();}}});countDownLatch.await();log.info("【init zooKeeper connect....】={}", zooKeeper.getState());} catch (Exception e) {log.error("init ZooKeeper connect error....】={}", e);}return zooKeeper;}
}

zk客户端

package com.et.zookeeper.api;import lombok.extern.slf4j.Slf4j;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import java.util.List;@Component
@Slf4j
public class ZkApi {@Autowiredprivate ZooKeeper zkClient;/*** check node is exist** @param path* @param needWatch* @return*/public Stat exists(String path, boolean needWatch) {try {return zkClient.exists(path, needWatch);} catch (Exception e) {log.error("【 node exception】{},{}", path, e);return null;}}/*** check node is exist and set watcher* @param path* @param watcher* @return*/public Stat exists(String path, Watcher watcher) {try {return zkClient.exists(path, watcher);} catch (Exception e) {log.error("【node  exception】{},{}", path, e);return null;}}/*** create persist node** @param path* @param data*/public boolean createNode(String path, String data) {try {zkClient.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);return true;} catch (Exception e) {log.error("【create persist node exception】{},{},{}", path, data, e);return false;}}/*** update persist node** @param path* @param data*/public boolean updateNode(String path, String data) {try {//The data version of zk starts counting from 0. If the client passes -1, it means that the zk server needs to be updated based on the latest data. If there is no atomicity requirement for the update operation of zk's data node, you can use -1.//The version parameter specifies the version of the data to be updated. If the version is different from the real version, the update operation will fail. Specify version as -1 to ignore the version check.zkClient.setData(path, data.getBytes(), -1);return true;} catch (Exception e) {log.error("【update persist node exception】{},{},{}", path, data, e);return false;}}/*** delete persist node** @param path*/public boolean deleteNode(String path) {try {//The version parameter specifies the version of the data to be updated. If the version is different from the real version, the update operation will fail. Specify version as -1 to ignore the version check.zkClient.delete(path, -1);return true;} catch (Exception e) {log.error("【delete persist node exception】{},{}", path, e);return false;}}/*** Get the child nodes of the current node (excluding grandchild nodes)** @param path*/public List<String> getChildren(String path) throws KeeperException, InterruptedException {List<String> list = zkClient.getChildren(path, false);return list;}/*** Get the value of the specified node** @param path* @return*/public String getData(String path, Watcher watcher) {try {Stat stat = new Stat();byte[] bytes = zkClient.getData(path, watcher, stat);return new String(bytes);} catch (Exception e) {e.printStackTrace();return null;}}}

zk监听器

package com.et.zookeeper.api;import lombok.extern.slf4j.Slf4j;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;@Slf4j
public class WatcherApi implements Watcher {@Overridepublic void process(WatchedEvent event) {log.info("【Watcher event】={}", event.getState());log.info("【Watcher  path】={}", event.getPath());log.info("【Watcher type】={}", event.getType()); //  three type: create,delete,update}
}

application.yaml

server:port: 8088
zookeeper:address: 127.0.0.1:2181timeout: 4000

controller

package com.et.zookeeper.controller;import com.et.zookeeper.api.ZkApi;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.HashMap;
import java.util.Map;@RestController
@Slf4j
public class HelloWorldController {@Autowiredprivate ZkApi zkApi;@GetMapping(value = "createNode")public boolean createNode(String path, String data) {log.debug("ZookeeperController create node {},{}", path, data);return zkApi.createNode(path, data);}
}

以上只是一些关键代码,所有代码请参见下面代码仓库

代码仓库

  • https://github.com/Harries/springboot-demo

4.测试

启动Spring Boot应用

创建节点

  • 访问http://127.0.0.1:8088/createNode?path=/hblog&data=test
  • 访问http://127.0.0.1:8088/createNode?path=/hblog/node1&data=node1

查看创建的节点



 

5.引用

  • Spring Boot集成zookeeper快速入门Demo | Harries Blog™
  • ZooKeeper 介绍 — zookeeper入门 文档

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

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

相关文章

大众点评全国店铺基础信息采集-爱车类店铺

2024年5月最新采集大众点评全国(内地)-爱车大类-店铺基础信息&#xff0c;120余万家 爱车类店铺 示例&#xff1a; 店铺id H7hoMM74HIBAREpy 店铺名称 手把手汽车陪练(北京总部) 十分制效果评分 9.2 十分制服务评分 9.2 十分制环境评分 9.2 人均价格 1233 评价数量 514…

学习Java的日子 Day45 HTML常用的标签

Day45 HTML 1.掌握常用的标签 1.1 标题标签 h1-h6 <h1>一级标签</h1> <h2>二级标签</h2> <h3>三级标签</h3> <h4>四级标签</h4> <h5>五级标签</h5> <h6>六级标签</h6> 显示特点&#xff1a; * 文字…

C语言经典例题-13

1.小乐乐走台阶 题目描述: 小乐乐上课需要走n阶台阶&#xff0c;因为他腿比较长&#xff0c;所以每次可以选择走一阶或者走两阶&#xff0c;那么他一共有多少种走法&#xff1f; 输入描述: 输入包含一个整数n (1 ≤ n ≤ 30) 输出描述: 输出一个整数&#xff0c;即小乐乐可以…

MemoryModule - exp - test

文章目录 MemoryModule - exp - test概述笔记测试环境GetModuleFileName不能正常执行GetModuleFileNameWntdll_LdrGetDllFullName猜测原因用LoadLibrary载入的DLL中功能是正常的 gLog可以正常使用内存载入DLL无法支持的功能的折中方法COM操作正常调用方代码接口代码 接口入参测…

基于springboot实现毕业设计系统项目【项目源码+论文说明】

基于springboot实现毕业设计系统演示 摘要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff…

绝地求生:盘点宝箱中能开出来的极品皮肤!

最近杜卡迪联名大伙儿不都开箱子出了一堆皮肤吗&#xff1f;很多人搞不清哪些皮肤要留&#xff0c;哪些皮肤可以分。 OK这篇文章稍微推荐几个我认为的高质量可兑换的皮肤&#xff0c;当然个人整理难免有疏漏&#xff0c;欢迎评论区补充。 余波学院黑丝袜 目前游戏里唯一一条显…

力扣 873. 最长的斐波那契子序列的长度 python AC

动态规划做法 class Solution:def lenLongestFibSubseq(self, arr):size len(arr)dp [[2] * size for _ in range(size)]maxv 0for i in range(2, size):for j in range(1, i):d arr[i] - arr[j]l, r 0, j - 1while l < r:mid (l r) // 2if arr[mid] d:l midbreak…

pgbackrest 备份工具使用 postgresql

为啥我会使用pgbackrest进行备份&#xff1f;因为postgresql没有自带的差异备份工具。。。而我们在生产环境上&#xff0c;一般都需要用到差异备份或者增量备份。我们的备份策略基本是&#xff0c;1天1次完整备份&#xff0c;1个小时1次差异备份。如果只需要完整备份&#xff0…

「PHP系列」PHP DOM扩展库/SimpleXML 解析XML文档

文章目录 一、DOM介绍二、DOM扩展库解析XML1. 加载XML文档2. 访问DOM树3. 读取和修改节点数据4. 保存修改后的XML文档5. 注意事项&#xff1a; 三、SimpleXML解析XML1. 加载XML文档2. 访问XML数据3. 修改XML数据4. 保存修改后的XML文档5. 注意事项&#xff1a; 四、相关链接 一…

Linux setserial命令教程:如何配置与查询串口设备(附实例详解和注意事项)

Linux setserial命令介绍 setserial 是一个用于获取和设置Linux串口信息的程序。这些信息包括特定串口使用的I/O端口和IRQ&#xff0c;是否将中断键解释为安全注意键等。 Linux setserial命令适用的Linux版本 setserial命令在大多数Linux发行版中都可以使用&#xff0c;包括…

知识库文档系统源码部署/搭建/上线/运营/售后/更新

一款基于ThinkPHPFastAdmin开发的知识库文档系统&#xff0c;可用于企业工作流程的文档管理&#xff0c;结构化记录沉淀高价值信息&#xff0c;形成完整的知识体系&#xff0c;能够轻松提升知识的流转和传播效率&#xff0c;更好地成就组织和个人。为部门、团队或项目搭建知识库…

SVN 合并到 Git 时有文件大于 100 M 被限制 Push

如果有文件大小大于 100M&#xff0c;GitHub 是会被限制推送到仓库中的&#xff0c;大概率情况会显示下面的错误&#xff1a; remote: Resolving deltas: 100% (3601/3601), done. remote: error: Trace: aea1f450da6f2ef7bfce457c715d0fbb9b0f6d428fdca80233aff34b601ff59b re…

LeetCode 513.找树左下角的值

LeetCode 513.找树左下角的值 1、题目 题目链接&#xff1a;513. 找树左下角的值 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null…

服务端JavaScript(Node.js)与去IO编程:Node.js的事件驱动和非阻塞IO模型,它是如何使JavaScript走向后端的

在Node.js中&#xff0c;JavaScript代码运行在V8引擎上。由于JavaScript是单线程语言&#xff0c;一次只能处理一个事件。为了解决这个问题&#xff0c;Node.js引入了事件驱动模型。每个进行IO操作的函数都是异步的&#xff0c;当这个函数被调用的时候&#xff0c;它不会立即执…

基于单片机的医用辅助器械简析

摘 要&#xff1a;单片机在医用辅助器械中用途广泛&#xff0c;传感装置与单片机控制系统相结合可设计出满足更多需求的医用辅助器械。本文主要探究不同传感装置与单片机结合的优缺点&#xff0c;先从分析医用辅助器械的工作原理入手&#xff0c;说明传感装置的作用&#xff0…

用字符串初始化的指针

一. 简介 前一篇文章简单学习了数组与指针的区别&#xff0c;文章如下&#xff1a; C语言中数组与指针的区别-CSDN博客 本文学习一下 初始化为 字符串的 指针。防止使用过程中出现问题。 二. 初始化指针来指向字符串 初始化指针来指向字符串&#xff0c;例如如下代码就是…

SpringBoot 具体是做什么的?

Spring Boot是一个用于构建独立的、生产级别的、基于Spring框架的应用程序的开源框架。它的目标是简化Spring应用程序的开发和部署过程&#xff0c;通过提供一种快速、便捷的方式来创建Spring应用程序&#xff0c;同时保持Spring的灵活性和强大特性。 1. 简化Spring应用程序开…

信安标委发布16项网络安全国家标准:8项为旧标准替代,8项标准为新发布

1. 背景 根据2024年4月25日国家市场监督管理总局、国家标准化管理委员会发布的中华人民共和国国家标准公告&#xff08;2024年第6号&#xff09;&#xff0c;全国网络安全标准化技术委员会归口的16项国家标准正式发布。 2. 标准清单 本次国家标准涵盖了信息技术安全评估准则、…

AScript纯本地离线文字识别插件

目的 AScript是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务&#xff0c;节省大量人工操作的时间。但按键精灵是不包含图色功能&#xff0c;无法识别屏幕上的图像&#xff0c;根据图像的变化自动执行相应的操作。本篇文章主要讲解下…

苹果M4芯片:推动AI时代的革新力量

随着科技的飞速发展&#xff0c;苹果公司一直以其创新精神引领着行业潮流。其中&#xff0c;M4芯片的推出无疑是苹果在人工智能领域迈出的重要一步。这款专为机器学习和AI计算而设计的芯片&#xff0c;不仅在新款iPad Pro等消费电子产品上亮相&#xff0c;更是预示着苹果即将开…