ZooKeeper源码阅读(二):客户端

zookeeper(4)—— zk客户端源码 以zk原生客户端为例: 我们在win下启动是从D:\tools\zookeeper\zookeeper-3.4.14\bin下的zkCli.cmd 打开这个脚本,可以看到其实就是运行org.apache.zookeeper.ZooKeeperMain这个类 一、看下ZooKeeperMain类的main方法 先概况的说下这个方法执行时做了哪些事情,再看它是如何做的 1、创建了一个NIO的socket连接(不然怎么连接服务端) 2、创建了sendThread 线程并启动(看名字就知道,这个线程 阅读详情

源代码:

http://svn.apache.org/repos/asf/zookeeper/trunk/

 

导入eclipse:

在包含build.xml目录下执行ant eclipse将产生.classpath文件

 

目录结构:

src/recipes:提供了各种Zookeeper应用例子

src/c:提供了c版客户端。zookeeper_st,zookeeper_mt两个library

src/contrib:别人贡献的代码?

src/generated:由jute生成的java实体类

 

客户端入口:org.apache.zookeeper.ZooKeeperMain

 

//读取命令行输入,用MyCommandOptions解析。

//内部类MyCommandOptions包含成员命令名command、参数列表cmdArgs

-option value –option value command cmdArgs

 

//根据以上解析的ip、端口,连接到ZooKeeper

        zk = newZooKeeper(host,

                Integer.parseInt(cl.getOption("timeout")),

                 newMyWatcher(), readOnly);

 

//执行命令,在ZooKeeperMain.run()

//ZooKeeperMain只是一个外壳,使用jline实现了命令提示功能。

//commandMapCli将提供的命令命令名与执行体CliCommand关联

        //execute from commandMap

        CliCommandcliCmd = commandMapCli.get(cmd);

        if(cliCmd!=null) {

           cliCmd.setZk(zk);

            watch =cliCmd.parse(args).exec();

                   }

 

//最终转到调用ZooKeeper方法

//提供的命令:

quit:Zk.close()关闭zk连接,调用cnxn.close()

history:列出历史记录

redo index:重新执行历史记录

printwatches [on]:查看/设置watche开关状态

connect:connectToZK(host)连接zk


//ZooKeeper内部连接

        cnxn = newClientCnxn(connectStringParser.getChrootPath(),

                hostProvider,sessionTimeout,this,watchManager,

                getClientCnxnSocket(),canBeReadOnly);

        cnxn.start();

 

 

ClientCnxn包含SendThread和EventThread两个线程

SendThread将事件添加到waitEvents队列中,EventThread线程消费该队列。


//下面以ls命令为例

//调用zk.getChildren

    public boolean exec() throwsKeeperException, InterruptedException {

        String path= args[1];

        boolean watch =cl.hasOption("w");

       List<String> children = zk.getChildren(path, watch);

        out.println(children);

        return watch;

    }


//getChildren生成request

       RequestHeader h = newRequestHeader();

       h.setType(ZooDefs.OpCode.getChildren);

       GetChildrenRequest request = newGetChildrenRequest();

       request.setPath(serverPath);

       request.setWatch(watcher != null);

       GetChildrenResponse response = newGetChildrenResponse();

        ReplyHeader r = cnxn.submitRequest(h, request,response, wcb);

 

 

//submitRequest调用queuePacket,阻塞直到收到response。

    publicReplyHeadersubmitRequest(RequestHeaderh, Record request,

            Recordresponse, WatchRegistration watchRegistration)

            throwsInterruptedException {

        ReplyHeaderr = new ReplyHeader();

        Packetpacket = queuePacket(h,r, request, response,null,null,null,

                   null, watchRegistration);

        synchronized(packet) {

            while (!packet.finished) {

               packet.wait();

            }

        }

        return r;

    }


//queuePacket将Packet添加到outgoingQueue队列中

            packet= new Packet(h, r, request, response,watchRegistration);

            packet.cb = cb;

            packet.ctx = ctx;

            packet.clientPath =clientPath;

            packet.serverPath =serverPath;

 

                outgoingQueue.add(packet);

 

         //然后唤醒selector

        sendThread.getClientCnxnSocket().wakeupCnxn();



//sendThread.run消费outgoingQueue

        clientCnxnSocket.doTransport(to,pendingQueue,outgoingQueue,ClientCnxn.this);

 

 

//selector判断读/写事件

//doTransport调用doIO,doIO解析Response

         //读事件

        int rc =sock.read(incomingBuffer);

        sendThread.readResponse(incomingBuffer);

         //写事件

       sock.write(p.bb);


//readResponse

//收到的package包括header,token, response字段

// 当header中xid是-1时,收到的notification,response字段解析得到WatchedEvent

// event将放入eventThread事件队列watingEvents

     WatcherEventevent = new WatcherEvent();

    event.deserialize(bbia, "response");

     …

     eventThread.queueEvent(we );

//在finally块中调用finishPacket

    try {

        packet.replyHeader.setXid(replyHdr.getXid());

        packet.replyHeader.setErr(replyHdr.getErr());

        packet.replyHeader.setZxid(replyHdr.getZxid());

        if(replyHdr.getZxid() > 0) {

            lastZxid =replyHdr.getZxid();

        }

        if(packet.response != null&& replyHdr.getErr() == 0) {

            packet.response.deserialize(bbia, "response");

        }

    } finally {

        finishPacket(packet);

    }

 

 

//finishPacket

//如果有回调,finishPacket也将packet放到eventThread的队列中

//否则设置packet.finish,此时submitRequest返回response。

    if (p.cb == null) {

        synchronized (p) {

            p.finished = true;

           p.notifyAll();

        }

    } else {

        p.finished = true;

        eventThread.queuePacket(p);

    }

 

 

//EventThread.run线程消费waintingEvents

Objectevent = waitingEvents.take();

processEvent(event);

 



以下图片转自:http://www.spnguru.com/2010/08/zookeeper%E5%85%A8%E8%A7%A3%E6%9E%90%E2%80%94%E2%80%94client%E7%AB%AF/

 


Zookeeper 客户端源码吐血总结 **目录 一、几个重要的类 2 二、JAVA的基础知识 2 三、大致了解 2 四 从入门到放弃的讲解 3 Code1:ZK 3 Code2:创建 Zookeeper实例,实例化ClientCnxn,实例化ClientCnxnSocketNIO 3 Code3:实例化ClientCnxnSocketNIO (which extends ClientCnxnSocket) 阅读详情

相关推荐

【ZooKeeper系列】3.ZooKeeper源码环境搭建

前文阅读:【ZooKeeper系列】1.ZooKeeper单机版、伪集群和集群环境搭建【ZooKeeper系列】2.用Java实现ZooKeeper API的调用 在系列的前两篇文章中,介绍了ZooKeeper环境的搭建(包括单机版、伪集群和集群),对创建、删除、修改节点等场景用命令行的方式进行了测试,让大家对ZooKeeper环境搭建及常用命令行有初步的认识,也为搭建ZooKeeper的开发环...

HuaZi_Myth的博客 2351

zookeeper源码解析

zookeeper zookeeper工作机制 Zookeeper从设计模式角度来理解 ​ 是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就 将负责通知已经在Zookeeper上注册的那些观察者做出相应的反应。 zookeeper的特点 ​ 1)Zookeeper:一个领导者(Leader),多个跟随者(Follower)组成的集群。 ​ 2)集群中只要有半数以上节点存活,Zookeeper集群就能正常

weixin_42403127的博客 4680

Zookeeper教程(三):ZooKeeper源码阅读之Worker机制及集群状态监控

前言:接下来将会着重解释一下ZooKeeper里面重要的代码,本次将针对Worker机制,以及运用Worker进行对集群状态进行监控。如果对Zookerper的安装配置和运用不了解的,可以看看上两篇文章:(1)Zookeeper教程(一):快速开始以及结合java实现分布式Barrier和Queue (2) Zookeeper教程(二):ZooKeeper与Dubbo结合以及原理讲解

KilluaZoldyck的博客 1706

zookeeper——启动zookeeper中的常见问题

原文地址:http://hi.baidu.com/luhao8415/item/23c6e7f075aa18b730c1993a 最近常有启动zookeeper出现问题的,整理下贴出来,以后也可以参考参考。。 1. 启动zookeeper后出现noClassFound等等错误,例如: Exception in thread "main" java.lang.NoSuchMethodError

qinglu000的专栏 12万+

zookeeper进阶(一)客户端建立连接及相应的源码分析

目录 zookeeper创建node 一个简单的实现 对应源码分析 zookeeper客户端建立连接package zk; import java.io.IOException; import java.util.concurrent.CountDownLatch; import org.apache.zookeeper.WatchedEvent; import org.apache.zookee

狂奔的菜鸟 1717

zookeeper源码阅读分析笔记--客户端服务端通信机制以及session超时、过期处理

zookeeper watch机制的原理分析

云计算、分布式架构、K8S、大数据、机器学习、搜索、推荐、广告 1万+

Apache ZooKeeper Watcher 机制源码解释

本文首先讲解了 Apache ZooKeeperWatcher 机制的使用方式,通过一个集群内部状态监听、触发动作的实例以及回调函数的基本知识,引发对于 Watcher 机制内部实现原理和源代码的讨论,然后通过对实现原理的解释让读者有一些工作方式的理解,接下来对源代码进行分析,进一步加深读者对 Watcher 机制的理解。

4572

Cisco思科 电子科技大学计算机网络 SRWE 期末技能考试 (PTSA)

电子科技大学2024春_SRWE_计算机网络系统 SRWE 期末技能考试 (PTSA)

2301_76745065的博客 5095

ZooKeeper源码阅读(二)---客户端流程

由于zk客户端流程对于zk单机服务或者集群基本一致,所以先从zk客户端源码开始学习。 1、客户端启动 首先我们启动一个单机的server,然后给ZookeeperMain打上断点进入调试 //成员变量 private static final Logger LOG = LoggerFactory.getLogger(ZooKeeperMain.class); //当前支持解析的command命令如ls等 static final Map<String, String>.

potxxx的博客 316

Java对接(BSC)币安链 | BNB与BEP20的开发实践(三)水龙头 WEB3

这一节我们讲一个币安测试链如何获取到BNB、USDT等BEP20数字货币(水龙头)来让我们前期测试开发。如图:我们将创建的地址填入相应输入框,来获取到测试BNB以及其他BEP20数字币。发币可能需要交易等待,请耐心等待即可,交易完成后,币会到达您的地址内。上一节我们用代码来实现BNB转账、BEP20转账、链上交易监控。2.MetaMask(小狐狸)浏览器插件 🪜。使用EDGE浏览器可以在浏览器直接打开。使用Chrome浏览器,请使用🪜打开。基本工作就绪后,即可进行开发测试。3. 测试区块链浏览器 🪜。

大猩猩的专栏 2790

systrace分析 之 问题初步定位

如下surfaceflinger空缺点,上面对应的bufferTX 中有buffer,但VSYNC-SF 过来后,SurfaceFlinger却没有去取,检查测试app “android.settings”, 也没有GPU completion 时间长的问题,所以该部分可以请SurfaceFlinger的owner 进一步确认为何不取buffer。. GPU拿的是acquireFence HWC拿的是releaseFence, GPU是绘图,HWC是合成显示,这两个是互相等待的关系,

yangzex的专栏 3197

ZooKeeper源码阅读心得分享+源码基本结构+源码环境搭建

ZooKeeper源码的脉络就像一个迷宫,要想玩这个迷宫游戏,必须找到迷宫的入口。最近把ZooKeeper源码看了个大概,有一些心得想和大家分享和探讨。

你学废了吗? 4667

【阅读文献笔记】FoundationStereo: Zero-Shot Stereo Matching

提出首个零样本泛化立体匹配基础模型设计 STA 模块融合单目先验提出 AHCF 模块增强代价滤波构建 100 万合成数据集 FSD + 自净化流程。

qq_46460379的博客 1258

【想进大厂还不会阅读源码】ShenYu源码-替换ZooKeeper客户端

ShenYu源码阅读。相信大家碰到源码时经常无从下手,不知道从哪开始阅读😭。我认为有一种办法可以解决大家的困扰!至此,我们发现自己开始从大量堆砌的源码中脱离开来😀。ShenYu是一个异步的,高性能的,跨语言的,响应式的 API 网关。

JavaSouth南哥 4640

华中科技大学计算机组成原理-单总线CPU设计(全部通关)

【计算机组成原理】 单总线CPU实验 华中科技大学-计算机组成原理 实验三 单总线CPU设计 第1关 MIPS指令译码器设计 第2关 单总线CPU微程序入口查找逻辑 第3关 单总线CPU微程序条件判别测试逻辑 第4关 单总线CPU微程序控制器设计 第5关 采用微程序的单总线CPU设计 第6关 现代时序硬布线控制器状态机设计 第7关 现代时序硬布线控制器设计

紫荆鱼的博客 4万+

【3D无序抓取】--终极技术详解

3D无序抓取技术详解:从感知到执行的全流程技术方案 本文系统梳理了3D无序抓取(Bin Picking)的核心技术栈,涵盖3D感知、抓取规划和机器人执行三大环节。在3D感知层,详细介绍了点云采集与预处理方法(PCL/Open3D)、物体分割(PointNet++)和位姿估计(PVN3D/DenseFusion)等关键技术。抓取规划部分重点解析了抓取生成(GraspNet)、质量评估(Dex-Net)和动态避障(MoveIt!)算法。机器人执行环节则涉及路径规划、力控技术和末端执行器选型。同时提供了完整的工具

weixin_45590420的博客 598

zookeeper原理及apache zookeeper源码阅读

文章目录一 简介二 zookeeper原理1,zookeeper集群中的各个节点是如何进行信息交换的?2,zookeeper集群中各个节点中的zoo.conf配置3,zookeeper集群节点的个数为什么最好为奇数?4,什么是脑裂现象(其实这个现象在好多的中间件都会存在)5,zookeeper的选主算法三 apache zookeeper源码阅读 一 简介 zookeeper是一个开源的分布式协...

zcswl7961的博客 9847

深入剖析 Wenet 下 AISHELL-1 的 run.sh 脚本:从数据准备到模型训练

run.sh脚本用于处理 AISHELL-1 数据集的整个训练和测试流程。我们将逐步分析脚本中的每个部分,包括环境变量、参数设置、各个阶段的执行等。stage: 设置脚本的起始阶段(如数据准备)。stop_stage: 设置脚本的结束阶段。通过对 Wenet 下 AISHELL-1 的run.sh脚本的详细剖析,我们希望你能更好地理解每个步骤的功能及其背后的原理。此脚本不仅为模型训练提供了便利,也为用户自定义和扩展训练流程提供了基础。希望本教程能帮助你顺利完成语音识别项目!

帅小柏的博客 1634

Zookeeper源码阅读之一(Zookeeper客户端)

本次阅读的zookeeper的版本是3.4.19 下面的图展示了zookeeper的客户端的主要架构,可以看到用户是利用Zookeeper来进行相应的接口如(getData,getChildren等)的调用,zookeeper会将用户传入的参数包装成一个Packet,这个Packet中维护了Request,Response以及Watch等数据,它会被加入到outgoingQueue中。 SendThread这个线程是一个轮询的线程,它的循环会进行IO操作,其中它的write操作会利用ClientCn.

ijbuhv的专栏 685

从LLM到VLM再到VLA:三兄弟的“变形记”——定义、架构演进与最新趋同

LLM、VLM、VLA虽然在时间上依次出现,但它们在架构上的演进并非线性替代,而是形成了一个从“理解语言”到“理解世界”再到“改变世界”的认知闭环。VLA之所以能在短短三年内从概念走向现实,正是因为它站在了LLM和VLM的肩膀上——RT-2的泛化能力来自互联网规模的VLM预训练,π0的扩散策略受益于生成式模型的突破,Helix的双系统架构借鉴了“快慢思考”的认知科学洞见。而反过来,VLA在实际部署中遇到的效率瓶颈和实时性要求,也在倒逼LLM和VLM向更轻量、更高效的架构方向演进。

Ven%的博客 492

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

一、zookeeper源码阅读建议

我使用集成环境idea来阅读源码,不管是eclipse还是idea下面的方法都适用。 1. 从github上把源码clone下来。 2. 进入主目录,使用ant eclipse命令来编译工程。(ant需要提前安装) 3. 将工程导入idea。然后就可以阅读源码了。 对于源码的阅读下面是我的几个心得,写出来分享下: 1. 在阅读zookeeper源码之前,最好还是先了解下zookeeper的

破老的博客 3463

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

zookeeper 进入客户端_ZooKeeper单机客户端的启动流程源码阅读

客户端的启动流程看上面的客户端启动的脚本图,可以看到,zookeeper客户端脚本运行的入口ZookeeperMain.java的main()方法, 关于这个类可以理解成它是程序启动的辅助类,由它提供开始的位置,进而加载出zk client的上下文创建ZooKeeperMain对象// todo zookeeper的入口方法public static void main(String args[]...

weixin_29018419的博客 1410

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Zookeeper源码分析

一. 源码环境搭建 (一)源码下载 1. 官方下载网址: zookeeper-release-3.5.4下载地址: :https://github.com/apache/zookeeper/tree/release-3.5.4 apache-ant-1.10.6-bin下载地址: https://ant.apache.org/bindownload.cgi 2. 百度网盘下载地址 zookeeper-release-3.5.4下载地址:zookeeper-release-3.5.4 .

舞鹤白沙编码日志 2293

Zookeeper源码分析笔记[1]-客户端源码分析

zk客户端源码分析

unlock的博客 1967

【ZooKeeper系列】3.ZooKeeper源码环境搭建及源码解读

前文阅读: 【ZooKeeper系列】1.ZooKeeper单机版、伪集群和集群环境搭建 【ZooKeeper系列】2.用Java实现ZooKeeper API的调用 在系列的前两篇文章中,我们介绍了ZooKeeper环境的搭建(包括单机版、伪集群和集群),对创建、删除、修改节点等通过命令行的方式进行测试,让大家对ZooKeeper的环境搭建及常用命令行有了初步的认识,也为搭建ZooKeeper的...

一起理解技术趋势,沉淀长期价值 1876

zookeeper源码_【ZooKeeper系列】3.ZooKeeper源码环境搭建

前文阅读:猿人谷:【ZooKeeper系列】1.ZooKeeper单机版、伪集群和集群环境搭建​zhuanlan.zhihu.com猿人谷:【ZooKeeper系列】2.用Java实现ZooKeeper API的调用​zhuanlan.zhihu.com在系列的前两篇文章中,介绍了ZooKeeper环境的搭建(包括单机版、伪集群和集群),对创建、删除、修改节点等场景用命令行的方式进行了测试,让大家...

weixin_39638468的博客 172
上一篇: ZooKeeper源码阅读(一):ZAB协议
下一篇: ZooKeeper源码阅读(三):服务器端
m_vptr
博客等级 码龄15年 69粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值