zookeeperAPI操作与写数据原理

 

要执行API操作需要在idea中创建maven项目

(改成自己的阿里仓库)导入特定依赖

添加日志文件

上边操作做成后就可以进行一些API的实现了

目录

 导入maven依赖:

创建日志文件:

创建API客户端:

(1)创建全局变量:

(2)初始化(init):

(3)创建节点(create):

(4)监听API:

(5)检测节点是否存在:

写数据原理:

(1)写流程之写入请求直接发送给Leader节点:

(2)写流程之写入请求发送给follower节点

 导入maven依赖:

<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>RELEASE</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.8.2</version>
</dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.7</version> </dependency> 
</dependencies> 

创建日志文件:

需要在项目的 src/main/resources 目录下,新建一个文件,命名为“log4j.properties”

log4j.rootLogger=INFO, stdout 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] 
- %m%n 
log4j.appender.logfile=org.apache.log4j.FileAppender 
log4j.appender.logfile.File=target/spring.log 
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout 
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] 
- %m%n 

创建API客户端:

(1)创建全局变量:

  String connectString="hadoop102:2181,hadoop103:2181,hadoop104:2181";int sessionTimeout=2000;ZooKeeper zkClient=null;
String connectString---要连接那个zookeeper,
int sessionTimeout ---延迟时间
ZooKeeper zkClient ---表示要创建的客户端  申请为全局变量有助于后边各方法的调用

(2)初始化(init):

  @Before
public void init() throws Exception {// Watcher watcher ---监听器zkClient= new ZooKeeper(connectString, sessionTimeout, new Watcher() {@Overridepublic void process(WatchedEvent watchedEvent) {List<String> children = null;System.out.println("-------------------------------");try {children = zkClient.getChildren("/", true);} catch (KeeperException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}for (String child : children) {System.out.println(child);}}});
}

@Befor注解在此不在解释不会可看本人前面文章(Java注解篇)

首先初始化了一个zookeeper的客户端对象

重写了process方法,这个方法在不使用监听器的时候可以不写代码

在开启监听器的时候(可以听后续监听器API)

由于监听器是调用一次只能使用一次,不能实时监听,所以我们要在初始化方法里添加监听逻辑(process方法),就会在每次所监听的数据发生改变的时候调用该方法,我们在创建客户端对象的时候为该对象设置了监听器,从而在删除的时候也会触发监听

(3)创建节点(create):

@Test
public void create() throws Exception {//String path,---在那个节点下创建节点// byte[] data, ----节点数据// List<ACL> acl,----权限// CreateMode createMode)----创建节点的类型String nodecreate = zkClient.create("/atguigu","tangxiaocong".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
}

(4)监听API:

@Testpublic void getChildren() throws Exception {//String path----监听路径, boolean watch---设置监听器为true//true注册一次监听(记不起来就去看监听原理)就只能生效一次,所以在init哪里就需要添加注册List<String> children = zkClient.getChildren("/", true);for (String child : children) {System.out.println(child);}// 延时阻塞--实时监控Thread.sleep(Long.MAX_VALUE);}

(5)检测节点是否存在:

 @Test//查看节点是否存在public void exists() throws InterruptedException, KeeperException {//关闭监听Stat exists = zkClient.exists("/atguigu", false);System.out.println(exists==null?"not exist":"exist");}

写数据原理:

(1)写流程之写入请求直接发送给Leader节点:

        1.客户端向leader发出写请求

        2.leader接收到写请求会通知靠近它的follower执行写请求

        3.follower回应给leader(三台服务器现在已经有两台做出了回应(大于1/2)就会开始进行写操作,让后再处理后续服务器---效率高)

        4.现在得出的回应大于1/2,则leader对客户端给出回应

        5.leader会继续给其他的follower发送写请求

        6.follower得到请求给出回应

(2)写流程之写入请求发送给follower节点:

        1. 客户端向follower发出写请求

        2.写请求转发从follower需要转请求给leader(转请求后于上述操作相似)

        3.先通知(转发请求的)follower执行写请求

        4.follower对leader的请求做出回应(已经超过半数服务器做出回应,则执行写操作)

        5.leader做出回应返回给转发请求的follower

        6.该follower返回给客户端(Client)

        7.leader通知其他follower执行写请求

        8.做出回应后重复5.6步骤

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

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

相关文章

阿里云服务器安装部署Docker使用教程

本文阿里云百科分享如何在云服务ECS实例上&#xff0c;部署并使用Docker。Docker是一款开源的应用容器引擎&#xff0c;具有可移植性、可扩展性、高安全性和可管理性等优势。开发者可将应用程序和依赖项打包到一个可移植的容器中&#xff0c;快速发布到Linux机器上并实现虚拟化…

学习51单片机怎么开始?

学习的过程不总是先打好基础&#xff0c;然后再盖上层建筑&#xff0c;尤其是实践性的、工程性很强的东西。如果你一定要先全面打好基础&#xff0c;再学习单片机&#xff0c;我觉得你一定学不好&#xff0c;因为你的基础永远打不好&#xff0c;因为基础太庞大了&#xff0c;基…

许多智能算法并不智能(续)

许多智能算法被认为并不智能&#xff0c;主要是因为它们在某些方面仍然存在一些限制。以下是一些常见的原因&#xff1a; 缺乏常识和理解能力&#xff1a;当前的智能算法主要依赖于大量的数据和模式识别来做出决策&#xff0c;但它们通常缺乏对世界的常识和深层理解。这意味着它…

Android界面设计与用户体验

Android界面设计与用户体验 1. 引言 在如今竞争激烈的移动应用市场&#xff0c;提供优秀的用户体验成为了应用开发的关键要素。无论应用功能多么强大&#xff0c;如果用户界面设计不合理&#xff0c;用户体验不佳&#xff0c;很可能会导致用户流失。因此&#xff0c;在Androi…

数据驱动与关键字驱动

初次接触自动化测试时&#xff0c;对数据驱动和关键字驱动不甚理解&#xff0c;觉得有点故弄玄须&#xff0c;不就是参数和函数其嘛&#xff01;其实其也体现了测试所不同与开发的一些特点&#xff08;主要指系统测试&#xff09;&#xff0c;以及和对技术发展的脉络的展现。 …

【TypeScript】this指向,this内置组件

this类型 TypeScript可推导的this类型函数中this默认类型对象中的函数中的this明确this指向 怎么指定this类型 this相关的内置工具类型转换ThisParameterType<>ThisParameterType<>ThisType TypeScript可推导的this类型 函数中this默认类型 对象中的函数中的this…

在CMamke生成的VS项目中插入程序

在主文件夹的CMakeLists.tex中加入SET(COMPILE_WITH_LSVM OFF CACHE BOOL "Compile with LSVM") 再添加IF(COMPILE_WITH_LSVM) MESSAGE("Compiling with: LSVM") ADD_DEFINITIONS(-DCOMPILE_WITH_LSVM) ADD_SUBDIRECTORY(LSVM) LIST(APPEND SRC LSVM_wrap…

MFC第三十天 通过CToolBar类开发文字工具栏和工具箱、GDI+边框填充以及基本图形的绘制方法、图形绘制过程的反色线模型和实色模型

文章目录 CControlBar通过CToolBar类开发文字工具栏和工具箱CMainFrame.hCAppCMainFrm.cppCMainView.hCMainView.cppCEllipse.hCEllipse.cppCLine.hCLine.cppCRRect .hCRRect .cpp CControlBar class AFX_NOVTABLE CControlBar : public CWnd{DECLARE_DYNAMIC(CControlBar)pro…

运营商二要素认证API接口:提供手机号实名验证服务,确保用户信息的真实性

随着互联网的快速发展&#xff0c;各行各业都需要用户进行实名认证。其中&#xff0c;涉及到用户个人信息的场景&#xff0c;如电商、游戏、直播、金融等需要用户实名认证的场景&#xff0c;必须要进行实名认证。然而&#xff0c;对于这些场景&#xff0c;用户的个人信息的真实…

使用Git进行项目版本控制

文章目录 1、什么是Git&#xff1f;2、安装Git3、Git汉化3.1 Git Bash汉化3.2 Git GUI汉化(了解) 4、快速上手Git基本命令5、Git是怎么运作的&#xff1f;6、工作区、暂存区、本地仓库、远程仓库的区别6.1 工作区6.2 暂存区6.3 本地仓库6.4 远程仓库6.4 总结 7、 Git具体工作流…

CClink IE转Modbus TCP网关连接三菱FX5U PLC

捷米JM-CCLKIE-TCP 是自主研发的一款 CCLINK IE FIELD BASIC 从站功能的通讯网关。该产品主要功能是将各种 MODBUS-TCP 设备接入到 CCLINK IE FIELD BASIC 网络中。 捷米JM-CCLKIE-TCP网关连接到 CCLINK IE FIELD BASIC 总线中做为从站使用&#xff0c;连接到 MODBUS-TCP 总线…

Flowable-边界事件-补偿边界事件

目录 定义图形标记XML内容使用示例演示demo 定义 补偿边界事件可以为所依附的节点附加补偿处理器&#xff0c;通过关联连接到补偿处理器&#xff08;compensation handler&#xff09;。补偿边界事件会在流程活动完成后根据情况&#xff08;事务取消或者补偿中间事件触发&…

oracle积累增量和差异增量

积累增量和差异增量&#xff1a; 对于 RMAN 来说&#xff0c;积累增量备份和差异增量备份都是增量备份的一种形式&#xff0c;它们之间的区别在于备份的范围和备份集的方式。 积累增量备份&#xff1a;在进行积累增量备份时&#xff0c;RMAN 会备份自最后一次完全备份或增量备…

【Windows 常用工具系列 5 -- Selenium IDE的使用方法 】

文章目录 Selenium 介绍Selenium IDE 介绍 Selenium IDE安装Chrome 浏览器安装Selenium IDE使用 Selenium 介绍 Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 Selenium家庭成员有三个&#xff0c;分别是S…

2023年即将推出的CSS特性对你影响大不大?

Google开发者大会每年都会提出有关于 Web UI 和 CSS 方面的新特性&#xff0c;今年又上新了许多新功能&#xff0c;今天就从中找出了影响最大的几个功能给大家介绍一下 :has :has() 可以通过检查父元素是否包含特定子元素或这些子元素是否处于特定状态来改变样式&#xff0c;也…

了解 Langchain️是个啥?:第 1 部分

一、说明 在日常生活中&#xff0c;我们主要致力于构建端到端的应用程序。我们可以使用许多自动 ML 平台和 CI/CD 管道来自动化 ml 管道。我们还有像Roboflow和Andrew N.G.的登陆AI这样的工具来自动化或创建端到端的计算机视觉应用程序。 如果我们想在OpenAI或拥抱脸的帮助下创…

毕业来北京要做的1000件事,第四十六,进行风险管理做B计划

风险管理就是指在项目进行过程中&#xff0c;识别可能的风险&#xff0c;对风险进行评估&#xff0c;并加以监控&#xff0c;从而减少风险对项目的负面影响。 对于风险管理&#xff0c;现在软件项目中提起的不多&#xff0c;应用的更少。主要原因还在于大家都比较乐观&#xf…

Redis原理简述

Redis原理简述 Redis 有哪些特性 1. 特性 key-value 型内存数据库单线程——原子化操作支持lua脚本发布与订阅可持久化逐出与过期……2. 持久化 RDB:经过压缩的二进制文件;fork子进程进行操作AOF:保存所有写命令;先写缓存再同步至AOF文件;文件过大时会触发AOF重写3. 过期…

QGIS3.28的二次开发八:显示shp的属性表

这里实现两个基本的 GIS 软件需求&#xff1a;矢量图层的属性表显示&#xff0c;以及根据属性筛选要素。 具体需求如下&#xff1a; 加载一个矢量图层并打开其属性表&#xff1b;输入筛选条件确认无误后&#xff0c;画布上和属性表中均只显示筛选后的要素。 QGIS 提供了若干…

山景DSP芯片可烧录AP8224C2音频处理器方案

AP8224C2高性能32位音频应用处理器AP82系列音频处理器是面向音频应用领域设计的新一代SoC平台产品&#xff0c;适用于传统音响系统、新兴的蓝牙或Wifi 无线音频产品、Sound Bar 和调音台等市场。该处理器在总体架构和系统组成上&#xff0c;充分考虑了音频领域的特点&#xff0…