目录
- CliCommand
- 数据结构
- parse()
- exec()
- ZooKeeper
- HostProvider
- ZKClientConfig
- ClientCnxnSocket
- 数据结构
- 构造函数
- ClientCnxn
- 数据结构
- 构造函数
- start()
CliCommand
数据结构
CliCommand定义了两个抽象方法,以CreateCommand为例来看下它的parse()
和exec()
方法。
先看下CreateCommand的类信息:
parse()
exec()
执行命令
CliCommand介绍到此。
ZooKeeper
在ZooKeeperMain的connectToZK()
中创建了客户端的实例ZooKeeperAdmin,在执行命令的时候通过将命令转成方法的参数最终传入客户端进行处理,因此本章来分析客户端ZooKeeperAdmin。
ZooKeeperAdmin父类是ZooKeeper,先看下他们的数据结构:
我们以ZooKeeperMain的connectToZK()
中的构造函数为切入点,
ZooKeeper中涉及到的4个对象:
- 获取服务端地址的HostProvider
- 客户端配置ZKClientConfig
- 处理IO事务的ClientCnxn
- 更底层的IO处理ClientCnxnSocket
在开始介绍Zookeeper的功能之前先了解这个几个类。
HostProvider
ZKClientConfig
默认情况下传入的clientConfig为null,所以需要调用ZKClientConfig的无参构造函数创建。
如果启动命令设置了client-configuration
参数,即配置文件的路径,那么在ZooKeeperMain的启动过程中会去读取配置文件的内容并存入ZKClientConfig中。
如果没有设置client-configuration
参数则仅仅读取java的一些默认属性,详细参数可以分析ZKClientConfig的无参构造函数分析。
ClientCnxnSocket
ClientCnxnSocket是ClientCnxn底层IO处理器,在Zookeeper中通过调用getClientCnxnSocket()
方法进行初始化:
默认创建的是ClientCnxnSocketNIO实例
数据结构
构造函数
ClientCnxn
在Zookeeper的构造函数中调用createConnection()
方法创建ClientCnxn,与服务器端类似,服务端使用的是ServerCnxn,客户端使用的是ClientCnxn,他们的功能就是处理客户端与服务端的交互。
数据结构
ClientCnxn的数据结构:
这里需要注意的是两个队列和两个线程:
- 待发送数据的
outgoingQueue
- 已发送等待结果的
pendingQueue
- 发送线程
sendThread
- 处理服务端相应的
eventThread
构造函数
start()
在Zookeeper的构造函数中,当ClientCnxn创建好了以后立即调用start()
方法。
这个方法很简单,就是将两个线程启动。