源码构建
源码地址:https://github.com/apache/zookeeper
- 使用git clone 源码
- 选择分支,我这里选择的是3.5.5分支
源码结构如图:
- zookeeper-recipes: 示例源码
- zookeeper-client: C语言客户端
- zookeeper-server:主体源码
-
刚打开时会发现缺少一大堆的类,根据README.md文件中的说明,我们首先需要先在根目录maven clean + install一次
如果出现类似由于java-doc生成文档失败导致install失败的话,可以将pom.xml文件中的doc项目类插件注释掉重新install
-
此时我们所需要的类就会生成到各个项目的target中,但是还是会少一个类
org.apache.zookeeper.version.Info
在包路径下新增类,发布版本时用的,对我们来说没啥用
package org.apache.zookeeper.version; public interface Info { int MAJOR=3; int MINOR=5; int MICRO=5; String QUALIFIER=null; int REVISION=-1; //TODO: remove as related to SVN VCS String REVISION_HASH="390fe37ea45dee01bf87dc1c042b5e3dcce88653"; String BUILD_DATE="08/27/2020 03:28 GMT"; }
-
打开bin目录下的脚本文件,找到启动类,分别为
- 客户端:
org.apache.zookeeper.ZooKeeperMain
- 服务端:
- 单机启动:
org.apache.zookeeper.server.ZooKeeperServerMain
- 集群启动:
org.apache.zookeeper.server.quorum.QuorumPeerMain
- 单机启动:
- 客户端:
-
此时启动是起不起来的,会报缺少配置文件的错,conf文件下编写配置文件
-
zoo.cfg
tickTime=2000 initLimit=10 syncLimit=5 dataDir=data clientPort=2181
这里可能会出现找不到类的一些错误,需要将pom文件中相关依赖的scope为provided的改为compile,也可以直接注释,因为默认就是compile
-
-
配置服务启动类的arg参数,
Program arguments
中填写配置文件的绝对路径,如:D:\zookeeper\conf\zoo.cfg
-
启动单机Zookeeper服务端
-
接下来尝试启动集群模式的Zookeeper,同样需要编写三份zoo.cfg,并且在数据卷路径下编写myid文件
-
将配置文件地址配到
Program arguments
栏中,启动QuorumPeerMain
-
启动客户端,客户端默认连接本机2181端口号,在参数栏中指定 server ip:port 可指定连接地址
源码解析
- 加载配置
- 开启清理旧日志线程
- 初始化对外服务(NIO 或 Netty)
- 初始化会话管理
- 将日志和快照文件的数据加载到内存中
- 启动NIO|Netty
- 开始选举