目录
- 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将命令发送给服务端处理,并等待处理结果。

















![java八股文面试[JVM]——JVM内存结构2](https://img-blog.csdnimg.cn/337de420415c4aa8b1347b5cd9dee5a3.png)

