目录
- ZooKeeperMain
- 数据结构
- 初始化
- 启动
- 1. 解析启动参数
- MyCommandOptions
- 数据结构
- 构造参数
- parseOptions()
- 2. 创建客户端实例
- 3. 处理客户端命令
- 1.解析命令字符串
- 2. 处理命令
ZooKeeperMain
客户端的启动类为ZooKeeperMain
数据结构
commandMap:存放zookeeper支持的命令,key为命令关键字,value为命令参数
commandMapCli:存放zookeeper的命令实例,每一个实例包括命令的名字、参数列表
zk:客户端实例,处理命令并将命令发送给服务器
初始化
先看下ZooKeeperMain的静态代码块
静态代码块的工作主要是将zookeeper支持的命令存放到commandMap和commandMapCli中,看下CommandFactory.Command中都定义了哪些命令:
枚举类Command中定义的命令都是CliCommand的继承类,接下来分析CliCommand。
启动
在源码环境搭建的过程中,启动客户端是通过ZooKeeperMain类来启动的,它的main函数如下:
从这个过程可以看出启动过程主要有两步:
- 解析启动选项参数,即-开头的参数
- 创建客户端实例connectToZK()
- 运行ZooKeeperMain的run()函数执行命令
1. 解析启动参数
MyCommandOptions
数据结构
构造参数
parseOptions()
解析启动时传入的命令参数
2. 创建客户端实例
3. 处理客户端命令
zookeeper使用jline作为监听命令的工具。
将命令字符串传入executeLine()方法
接下来我们逐一分析这些过程
1.解析命令字符串
将输入端输入的命令字符串line进行切割处理,将数据存放到MyCommandOptions的参数中
2. 处理命令
将第1步中的解析到的MyCommandOptions传入processCmd()方法中处理
以上就是从控制台输入一条命令字符串到调用客户端实例zookeeper方法的过程。
蓝色部分对于不同的命令有所不同,而客户端在解析命令以及将其发送到服务端的过程是一样的。客户端最终通过ClientCnxn和ClientCnxnSocket将命令发送给服务端处理,并等待处理结果。