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