前言
每个Java程序员都应该看懂、吃透几套框架的源码,它将帮我们在技术功底上建立无与伦比的信心!
原因有以下几点:
- 我们在学习过程中,写过很多例子代码,但是这个例子代码,在工业实践中是确实可用的嘛?我们并没有底,直到看过工业界很成熟、很通用的技术框架,发现他们的用法,发现他们就是这么用的,或者也有一些更完善之处,印证之后,立刻顿悟。
- 吃透一套工业级框架,领会其完整流程,能极大提高设计思想和技术功底。原来他们是这么做的啊,我看懂了,我吃透了,我也能修复某个Bug了,我也能开发一套了。。。
如何看源码
DEBUG
刚开始看源码时,可能感到无从下手,不知道从哪里看起,这个阶段,有个小技巧,可以远程DEBUG,让框架运行起来,然后通过设置断点,看框架的运行、调用步骤。
比如,对于ZooKeeper,可以在zkServer.sh中增加配置,开启远程调试,如下:
然后,就可以通过IDE工具,进行远程调试了。
搭环境
框架如果是可以运行的,请一定搭一套可以运行的准生产环境,调整参数查看运行效果。
并辅助用Jstack、Jmap、MAT工具,分析类情况、分析堆情况、分析线程情况。
用一台机器,开多个端口,模拟1一个3台机器的集群。
zoo.cfg
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/work/zookeeper/1/data/
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=localhost:2888:3888
server.2=localhost:2777:3777
server.3=localhost:2666:3666
zkStart
#!/bin/bash
/work/zookeeper/3/bin/zkServer.sh start
/work/zookeeper/2/bin/zkServer.sh start
/work/zookeeper/1/bin/zkServer.sh start
zkStop
#!/bin/bash
/work/zookeeper/3/bin/zkServer.sh stop
/work/zookeeper/2/bin/zkServer.sh stop
/work/zookeeper/1/bin/zkServer.sh stop
zkLog
#!/bin/bash
java -cp /work/zookeeper/1/zookeeper-3.4.8.jar:/work/zookeeper/1/lib/slf4j-api-1.6.1.jar:/work/zookeeper/1/lib/log4j-1.2.16.jar:/work/zookeeper/1/lib/slf4j-log4j12-1.6.1.jar org.apache.zookeeper.server.LogFormatter $1
zkSnapshot
#!/bin/bash
java -cp /work/zookeeper/1/zookeeper-3.4.8.jar:/work/zookeeper/1/lib/slf4j-api-1.6.1.jar:/work/zookeeper/1/lib/log4j-1.2.16.jar:/work/zookeeper/1/lib/slf4j-log4j12-1.6.1.jar org.apache.zookeeper.server.SnapshotFormatter $1
记录和印证
请写学习笔记,无论是一遍WIKI,一个流程图,都可以。在Mac下画流程图的话,感觉Axure是不错的工具。
没事的时候,可以多翻翻别人写的源码学习笔记。
如果有身边的同事一起看,就更好了,没事还可以讨论一下。
ZooKeeper基础
基础Java知识
看ZooKeeper源码,需要这些Java基础知识:
- 必须:Socket(NIO、IO、对协议的理解)、线程(thread、runnable、wait、java.util.concurrent.*)
- 次之:持久化(序列号、反序列化)、数据结构(数、Map)
- 理论:原子广播,快速选举,找时间看看也行,先不看也行
基本概念
有问题,看官网:http://zookeeper.apache.org/doc/r3.4.8/
下面总结几个初级的,重要的:
http://blog.csdn.net/puma_dong/article/details/23520325#t8
ZXID:ZooKeeper Transaction ID,每一次事务操作(即写操作),都会生成一个ZXID,Long型,64位,前32位是EPOCH,后32位是事务递增ID
EPOCH:每一次选举结束,Leader都会有一个自己的EPOCH,有自己的一个朝代;ElectionEpoch,选择过程中的选举轮数,即逻辑锁
initLimit:集群选举期间,如果指定的initLimit内没有半数以上达成一致;或者工作期间,没有半数以上回应;则重新进入Leader选举;默认是10,代表10个tickTime,即20秒
syncLimit:发送和接受一次信息,允许的最长时间;默认是5,代表5个tickTime,即10秒
ZooKeeper核心内容流程图
概述
数据请求
快速选举
看看线程
Leader线程图示:
Follower1线程图示:
Follower2线程图示: