1.学习了解zookeeper (大概会使用,了解基本概念,使用的外部流程)
2.了解内部机理(zookeeper 有介绍内部机理. 内部交互流程. 除了普通guide和develop 外)
3. 学会安装并允许zk (我也直接忽略了)
4. 找到入口类(通过安装文件,我是别人直接告诉的)
5. 一开始直接看了,看到后面有点累了.陷到点里面去了.(源码研究文章其实有很多,但此次目的是为了自己看懂.就没有去搜索对应的文章)
6.果断扭转方向.尝试ide中编写.(zookeeper eclipse 环境搭建之路 (idea)
另外一个同事采用的是手动部署两台,然后远程debug的模式.. 手脚要快,不然启动流程一下就过去了.(可以通过配置 debug参数 suspend=true来实现 )
7.执行入口类的单测. 执行业务流单测 (没有网络交互)
别人的文章图解 fastLeader http://www.open-open.com/lib/view/open1413796647528.html . 要学会画无职责的流程图(含循环+ 节点批注)
类似图比较好. 但是这个图还是没有画出 存储结构,数据流中转等.
所有的设计都是 流程+边界+实体(同一个实体不同时期有不同的角色,对zk机器而已,不同的流程分别是 QuorumPeer,leader,learner. ).
这些实体的抽象命名是很关键的.
写源代码解析还是要
先说业务逻辑:交互图,时序图(边界). 流程图(内部逻辑) ,
再到实现层面的类图,实体图(依赖关系,属性归属,互相依赖是最差的实现,也是最方便的实现, 见 Leader 和 内部类 learnLeader的关系.).
相应的图表文件等上传到gitHub上去.当做代码管理和云存储.分享给大家.
边界:
0. 选举时通信边界:
流程:
选举之后的数据同步. Observer.processPacket 处理来自leader的消息.
zk集群接收客户端请求后zookeeper 读写过程 .ZooKeeperServer.processPacket(ServerCnxn, ByteBuffer) 处理来自客户端的消息 进一步调用ZooKeeperServer.submitRequest(Request) .后续调用process 通过组合来实现各个角色的功能. 流程是类似的.抽象出通用的东西出来并且利用设计模式,不仅仅是简单的组合调用了.
leader的learnHader也会调用ZooKeeperServer.submitRequest(Request)
故leader的请求一种来自外部,一种来自内部的转发.
实体:
层次关系, 内存型中间件的也可以有实体. 把实体抽象出来,逻辑抽象出来. 其他就都是内部的BO了.
一个程序的包没有体现出这些,自己就应该去抽象出这些实体类.持久化的实体类.
socket这种都是框架属性,完全可以归属到在业务外的包中.
T
3.内部类:
1.配置类: 含
2.原子文件操作 ,不错的思路.AtomicFileOutputStream