Zookeeper3.7源码剖析
能力目标
- 能基于Maven导入最新版Zookeeper源码
- 能说出Zookeeper单机启动流程
- 理解Zookeeper默认通信中4个线程的作用
- 掌握Zookeeper业务处理源码处理流程
- 能够在Zookeeper源码中Debug测试通信过程
1 Zookeeper源码导入
Zookeeper是一个高可用的分布式数据管理和协调框架,并且能够很好的保证分布式环境中数据的一致性。在越来越多的分布式系。在越来越多的分布式系统(Hadoop、HBase、Kafka)中,Zookeeper都作为核心组件使用。
我们当前课程主要是研究Zookeeper源码,需要将Zookeeper工程导入到IDEA中,老版的zk是通过ant进行编译的,但最新的zk(3.7)源码中已经没了build.xml
,而多了pom.xml
,也就是说构建方式由原先的Ant变成了Maven,源码下下来后,直接编译、运行是跑不起来的,有一些配置需要调整。
1.1 工程导入
Zookeeper各个版本源码下载地址https://github.com/apache/zookeeper,我们可以在该仓库下选择不同的版本,我们选择最新版本,当前最新版本为3.7,如下图:
找到项目下载地址,我们选择https
地址,并复制该地址,通过该地址把项目导入到IDEA
中。
点击IDEA的VSC>Checkout from Version Controller>GitHub
,操作如下图:
克隆项目到本地:
项目导入本地后,效果如下:
项目运行的时候,缺一个版本对象,创建org.apache.zookeeper.version.Info
,代码如下:
public interface Info {
public static final int MAJOR=3;
public static final int MINOR=4;
public static final int MICRO=6;
public static final String QUALIFIER=null;
public static final int REVISION=-1;
public static final String REVISION_HASH = "1";
public static final String BUILD_DATE="2020-12-03 09:29:06";
}
1.2 Zookeeper源码错误解决
在zookeeper-server
中找到org.apache.zookeeper.server.quorum.QuorumPeerMain
并启动该类,启动前做如下配置:
启动的时候会会报很多错误,比如缺包、缺对象,如下几幅图:
为了解决上面的错误,我们需要手动引入一些包,pom.xml
引入如下依赖:
<!--引入依赖-->
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-core</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.xerial.snappy</groupId>
<artifactId>snappy-java</artifactId>
<version>1.1.7.3</version>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-server</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-servlet</artifactId>
</dependency>
<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
</dependency>
1.3 Zookeeper命令(自学)
我们要想学习Zookeeper,需要先学会使用Zookeeper,它有很多丰富的命令,借助这些命令可以深入理解Zookeeper,我们启动源码中的客户端就可以使用Zookeeper相关命令。
启动客户端org.apache.zookeeper.ZooKeeperMain
,如下图:
启动后,日志如下:
1)节点列表:ls /
ls /
[dubbo, zookeeper]
ls /dubbo
[com.itheima.service.CarService]
2)查看节点状态:stat /dubbo
stat /dubbo
cZxid = 0x3
ctime = Thu Dec 03 09:19:29 CST 2020
mZxid = 0x3
mtime = Thu Dec 03 09:19:29 CST 2020
pZxid = 0x4
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 13
numChildren = 1
节点信息参数说明如下:
key | value |
---|---|
cZxid = 0x3 |
创建节点时的事务ID |
ctime = Thu Dec 03 09:19:29 CST 2020 |
最后修改节点时的事务ID |
mZxid = 0x31 |
最后修改节点时的事务ID |
mtime = Sat Mar 16 15:38:34 CST 2019 |
最后修改节点时的时间 |
pZxid = 0x31 |
表示该节点的子节点列表最后一次修改的事务ID,添加子节点或删除子节点就会影响子节点列表,但是 |