6. 源码| 环境准备
1. 导入并修改源码工程
从github上下载源码:https://github.com/apache/zookeeper
1.1 导入说明
这里下载的是 Zookeeper3.7.0
工程的源码,从 3.6.0 版本开始, zk 源码工程是一个可以直接导入的 maven 工程,而之前是需要通过 ant 构建的工程。
不过,该源码工程也并不是直接编译后就可直接运行的类,其需要经过一些专门的处理
。 因为工程中有很多的没有任何扩展名或扩展名为.jav 或.j 的类,这些类需要经过特殊处理后 才可编译。
我们这里通过手工处理,直接对要使用到的 java 源码文件进行重命名,为其添加.java 的扩展名即可
,这样就可以跟踪源码了。
1.2 模块说明
zk 源码工程中具有代码的模块共有两个: zookeeper-jute 与 zookeeper-server。
zookeeper-jute 是 zk 的底层序列化协议包
。用于 zk 进行网络数据传输和本地磁盘数据存储的序列化与反序列化。zookeeper-server 是 zk 的核心功能实现包
。
zookeeper-server 下的包进行说明:
client:client要和server之间通信,就通过改包下代码实现
common:一些工具
jmx:Java Management Extensions,提供一种分布式应用的监控技术
JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序、设备、系统等植入管理功能的框架。
JMX在Java编程语言中定义了应用程序以及网络管理和监控的体系结构、设计模式、应用程序接口以及服务。通常使用JMX来监控系统的运行状态或管理系统的某些方面,比如清空缓存、重新加载配置文件等
主要作用是提供接口,允许有不同的实现
server:服务端真正核心的代码
- 打开server目录:quorum:选举核心代码
util:放了一个安全工具
2. 项目运行
项目运行的时候,缺一个版本对象,在zookeeper-server下创建 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";
}
2.1 Zookeeper源码错误解决
在 zookeeper-server 中找到 org.apache.zookeeper.server.quorum.QuorumPeerMain 并启动该类,启动前做如下配置:
启动前,我们需要手动编译一下 zookeeper-jute这个包
,有一些序列化的类需要编译。
启动的时候会会报很多错误,比如缺包、缺对象等,为了解决这个错误,我们需要手动引入一些包, 在zookeeper-server下的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>
重新启动,就可以启动成功了。