zookeeper source code analysis

Zookeeper 初识

从本章开始将进入Zookeeper项目的源码分析。本章围绕Zookeeper项目的源码获取、编译和运行方式进行说明。

Zookeeper 源码编译

本节将对Zookeeper项目源码编译过程进行说明,本节将从零开始搭建Zookeeper项目源码阅读环境,首先需要准备源码编译的基础工具,具体有JDK8以上、git、Maven包管理工具以及IDEA编辑器。基础工具准备完成后需要在GitHub上找到Zookeeper项目所在的仓库,并将其克隆到本地,具体操作命令如下。

git clone [email protected]:apache/zookeeper.git

在克隆完成后会在本地仓库中看到如下内容。

image-20220221083147387

通过git clone命令获取的源码处于master分支,master分支会持续迭代Zookeeper项目中的新特性不太适合用于源码阅读,用于源码阅读的分支建议是从发布版本中进行选择,本书选择的发布版本为3.5.9,接下来将进行分支切换,具体命令如下。

git checkout release-3.5.9

完成版本切换以后需要将其放入到IDEA编辑器中,放入的形式十分简单只需要用IDEA将本地Zookeeper项目所在的文件夹打开即可,使用IDEA打开后会将其默认识别为Maven项目。在IDEA加载完成后需要进行编译操作,开始编译之前需要将Zookeeper项目中在POM文件中的<scope>provided</scope>信息全部去掉,避免JAR包下载失败(在Zookeeper项目源码中使用本地JAR的方式进行部分依赖管理)。 移除完成后执行编译命令,指令如下

mvn clean install -DskipTests=true

执行完成上述命令后需要在zookeeper-jute的编译结果中确认是否存在generated-sources文件夹,如果不存在则说明编译失败需要重新编译,如果存在则会有如图所示内容。

image-20220221085345368

经过上述操作Zookeeper项目源码环境已经编译完成,接下来需要将Zookeeper项目以源码的形式进行启动。首先需要准备log4j相关的日志配置,这部分内容可以在Zookeeper项目源码中找到,具体路径为conf/log4j.properties,将该文件拷贝到Zookeeper项目源码的zookeeper-server文件夹中的resources目录中,拷贝结果如图所示。

image-20220221085713920

在拷贝完成后需要将zookeeper-server文件夹中的resources文件夹设置为IDEA识别的资源,在resources文件夹处单击右键,依次选择Mark Directory as选项、Resources Root选项,具体操作内容如图所示。

image-20220221085850994

上述操作的目的是为了让日志配置(log4j.properties文件)生效。接下来需要准备Zookeeper项目的启动配置,启动配置的模板位于conf/zoo_sample.cfg文件中,将zoo_sample.cfg文件拷贝并且重命名为zoo.cfg,文件内容不做修改。至此启动前的预备工作都完成了,最后需要对启动项进行配置,Zookeeper项目源码的核心启动类是ZooKeeperServerMain,对该启动类进行启动配置需要设置zoo.cfg文件,配置后信息如图所示。

image-20220221094148464

在配置完成后启动ZooKeeperServerMain类,启动后会在控制台输出Zookeeper环境相关内容、启动时间、占用端口、文件快照等信息。

image-20220221094601943

至此Zookeeper项目通过源码的方式启动就完成了,接下来可以通过zkCli来对进行Zookeeper相关操作。Zookeeper客户端可执行文件位于bin目录下,Windows操作系统选择zkCli.cmd文件运行,Linux操作系统选择zkCli.sh文件运行,运行后可以看到如图所示内容。

image-20220221095040952

接下来输入使用zkCli.sh中的一些命令进行Zookeeper操作,最简单的操作是查看根目录下的节点信息,在zkClie命令行中输入"ls /"控制台输出信息如下。

[zk: localhost:2181(CONNECTED) 3] ls /
[zookeeper]

查看/zookeeper状态可以使用" stat /zookeeper"命令,控制台输出信息如下。

[zk: localhost:2181(CONNECTED) 6] stat /zookeeper
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -2
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 2

总结

本章对Zookeeper项目的源码获取和编译做出详细的说明,在整个编译过程中需要关注的有两个,第一个是POM文件中JAR包的作用域修改,第二个是Zookeeper源码启动的配置。在编译并且启动Zookeeper之后使用zkCli进行Zookeeper的一些简单操作.