zookeeper源码分析
源码编译
环境准备
- Maven:3.5.4
- Jdk:1.8.0_201
- idea:2019.1 Community Edition(社区版)
源码地址
官网地址:https://github.com/apache/zookeeper
本例下载的是 release-3.5.8 版本,下载完后解压。
使用idea打开项目进行编译
导入Idea:File –> Open –> 选择ZooKeeper项目目录 zookeeper-3.5.8
添加Info文件
1
2
3
4
5
6
7
8
9
10
11
12
13...\zookeeper-release-3.5.8\zookeeper-server\src\main\java\org\apache\zookeeper\version\Info.java
package org.apache.zookeeper.version;
public interface Info {
int MAJOR = 1;
int MINOR = 0;
int MICRO = 0;
String QUALIFIER = null;
int REVISION = -1;
String REVISION_HASH = "1";
String BUILD_DATE = "2020‐10‐15";
}编译命令:mvn clean package -Dmaven.test.skip=true
可能出现的问题
问题1:
1 | [ERROR] Failed to execute goal org.codehaus.mojo:properties-maven-plugin:1.0.0:read-project-properties (default) on project zookeeper: Properties could not be loaded from File: /Users/h__d/Documents/git-repository/zookeeper-3.6.0/zookeeper-server/src/main/resources/git.properties -> [Help 1] |
分析:缺少了 zookeeper-3.6.0/zookeeper-server/src/main/resources/git.properties 文件,而properties-maven-plugin需要使用此文件(不明白为啥没有自行生成该问题)
解决:添加 git.properties 文件,内容如下,最好不要注释插件,否则还会有问题
1 | # git提交id(编一个,或使用github上的id) |
运行Zookeeper服务端
1)添加配置文件,复制conf/zoo_sample.cfg,重命名文zoo.cfg
1 | ...\zookeeper-release-3.5.8\conf\路径下添加zoo.cfg文件 |
2)配置日志配置文件:将conf/log4j.properties 复制到 zookeeper-server/src/main/resources 下面
且在zookeeper-server下src/main/resource上,鼠标右键,Mark Directory as -> Root Resources
3)找到服务端启动类
分析 bin/zkServer.sh 启动脚本 -> 找到 start 启动参数对应的逻辑 -> 找到主启动类参数:ZOOMAIN -> ZOOMAIN的值:org.apache.zookeeper.server.quorum.QuorumPeerMain
找到 ZOOMAIN=”org.apache.zookeeper.server.quorum.QuorumPeerMain”,QuorumPeerMain即为服务端主启动类 ZOOCFG=”$2” 可知是通过外部传参进来的
4)运行QuorumPeerMain服务端主启动类,且进行运行配置
可能出现的问题
问题一:
1 | java.lang.NoClassDefFoundError: org/eclipse/jetty/server/Connector |
解决:
pom.xml中修改jetty-server的配置,将scope的provided修改为compile:
1 | <dependency> |
用客户端命令连接源码启动的server:
1 | bin/zkCli.sh ‐server 127.0.0.1:2181 |