一、源码
1.1、源码下载
1.2、源码介绍

1.3、maven执行install

<dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-server</artifactId><!--<scope>provided</scope>--></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-servlet</artifactId><!--<scope>provided</scope>--></dependency><dependency><groupId>org.eclipse.jetty</groupId><artifactId>jetty-client</artifactId><!--<scope>provided</scope>--></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><!--<scope>provided</scope>--></dependency><dependency><groupId>io.dropwizard.metrics</groupId><artifactId>metrics-core</artifactId><!--<scope>provided</scope>--></dependency><dependency><groupId>org.xerial.snappy</groupId><artifactId>snappy-java</artifactId><!--<scope>provided</scope>--></dependency>
二、源码调试




2.1、解析参数

VM options:-Dlog4j.configuration=file:conf\log4j.propertiesProgram arguments:conf\zoo_sample.cfg
记不记得我们在linux中安装zk的时候,做的一步操作是把zoo_sample.cfg复制一份改成zoo.cfg,然后我们就可以通过./zkServer.sh start启动zk了,如果不做这步操作,那启动的时候需要指定配置文件./zkServer.sh start ../conf/zoo_sample.cfg,为什么?我们去linux上看下zkServer.sh这个启动脚本里的内容

vi zkEnv.sh

# 心跳时间,用于配置服务器最小时间的单位,默认值3000ms,心跳检测时间通常是该单位的倍数。如客户端与服务端之间的会话超时时间在2tickTime~20tickTime之间tickTime=2000# 用于配置leader服务器等待Follewer服务器启动,并完成数据同步的时间,默认为10,表示10*tickTimeinitLimit=10# 用于配置leader服务器和Follewer服务器之间进行心跳检测的最大延时时间,默认为5,表示5*tickTimesyncLimit=5# 用于配置zookeeper服务器存储快照文件(zookeeper 节点数据)的目录,无默认值dataDir=conf/data# 用于配置服务器存储事务日志文件的目录,有默认值dataDir,但是建议将两个目录分别配置,防止磁盘的并发读写,影响服务器性能。可将其配置在一个单独的磁盘上#dataLogDir=# 用于配置当前服务器对客户端暴露的端口,一般配置为2181,无默认值clientPort=2182# 从socket层面限制单个客户端和单台服务器之间的最大并发连接数,即以IP地址粒度来进行连接数的限制,如果为0,表示不作限制,默认为60#maxClientCnxns=60# 这个参数和autopurge.purgeInterval搭配使用,这个参数指定了需要保留的文件数目。默认是保留3个autopurge.snapRetainCount=3# Purge task interval in hours# 3.4.0及之后版本,ZK提供了自动清理事务日志和快照文件的功能,这个参数指定了清理频率,单位是小时,需要配置一个1或更大的整数,默认是0,表示不开启自动清理功能autopurge.purgeInterval=1

注:为了避开默认值的干扰,这里将端口修改为2182,证明配置加载正常
2.2、数据清理器DatadirCleanupManager
2.2.1、初始化一个DatadirCleanupManager

2.2.2、启动DatadirCleanupManager




这块就不细说了,很简单,就是创建这两个文件夹,然后校验下这两个文件夹有没有创建成功,有没有对这两个文件夹的写权限等,默认生成的文件夹名字是version-2,
可以上linux上看下这个文件夹里的内容(因为我的linux上的zk中有数据)








2.3、执行启动流程



2.3.1、分析单机模式的启动




if (config.getClientPortAddress() != null) {cnxnFactory = ServerCnxnFactory.createFactory();cnxnFactory.configure(config.getClientPortAddress(), config.getMaxClientCnxns(), config.getClientPortListenBacklog(), false);cnxnFactory.startup(zkServer);zkServer has been started. So we don't need to start it again in secureCnxnFactory.needStartZKServer = false;}









2.3.2、分析集群模式的启动
文章转载自Java Miraculous,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




