浅谈分布式注册中心Zookeeper之客户端源码

zookeeper客户端的主类入口是Zookeeper类,负责与zookeeper server端的通信以及触发watcher等,下面就开始从第一行代码开始看起。

1.首先从构造方法开始,把我们自己的zk地址传进去,这个构造方法又调用了一个默认的构造方法,去进行连接。

在这里插入图片描述
在这里插入图片描述

 ConnectStringParser connectStringParser = new ConnectStringParser(
                connectString); 这行代码主要是解析服务获取 IP以及端口号
通过一个ClientCnxn用来管理与服务器的网络通信;一个watchManager用来管理watcher,顾名思义也就是监听。此外定义了内部类 ZKWatchManager 和 WatchRegistration,后者用来注册watcher到相应的watchset。以及供用户使用的API create exists setData getData 和getChildren以及相应的异步方法等。zookeeper客户端的启动是cnxn.start()方法,这个start不是当前对象的线程启动方法,而是里面调用了两个对象,那两个对象才是真正的线程启动方法。

在这里插入图片描述

2.可以看到,这个方法中开启了两个线程,一个SendThread、一个是EventThread。其中SendThread负责发送 数据请求/ping等信息给服务端以及负责读取服务端发送回来的信息。EventThread负责出来服务端发来的事件信息。
3. SendThread类又继承了一个ZooKeeperThread,ZooKeeperThread又继承了Thread类,所以SendThread类里面肯定会有个run()方法,我们点到run方法里面去。

在这里插入图片描述

在这里插入图片描述

这个run()方法里面的while主要做了一下事情,如果没有连接:发起连接 -- 此处会调用 clientCnxnSocket的connect方法
3   如果是连接状态,处理sasl事情 
4   使用to表示客户端距离timeout还剩多少时间,准备发起ping连接
5   调用clientCnxnSocket.doTransport(to, pendingQueue, outgoingQueue, ClientCnxn.this); 
注意到,最后他会调用doTransport方法 。

在这里插入图片描述

其中 pendingQueue是一个用来存放已经发送、等待回应的Packet队列,outgoingQueue是一个存放等待发送的Packet的队列。connect方法会做些什么呢?首先会创建一个sock,然后将sock注册到selector,如果立刻连接上了,调用 sendThread.primeConnection(),primeConnection 主要是用来注册zookeeper之前所有的watcher,以及认证信息。
4. 接下来看下doTransport方法会干些什么

在这里插入图片描述

它会选择已经就绪的事情,如果是connect成功时间,调用primeConnection;如果是读写事件,调用doIO(pendingQueue, outgoingQueue, cnxn),此外,如果发现outgoingQueue里的findSendablePacket,还需要 enableWrite。

在这里插入图片描述

5.跟进去看看doIO()方法干了什么

在这里插入图片描述

未完待续!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值