zookeeper 在SOA服务中应用广泛,值得深入理解源码,方便码农随意使用。
直接上源码
1、实例化 ZooKeeper
ZooKeeper zk = new ZooKeeper("100.58.57.44:2181", 5000,new Watcher() { //可以配置多个ip:port 多个以,隔开 // 监控所有被触发的事件 public void process(WatchedEvent event) { } });
咱们进入 new ZooKeeper看看究竟
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) throws IOException { this(connectString, sessionTimeout, watcher, false); //false 表示这个可不只是只读模式,还能写 }
下面的才是很有干货哦,请注意
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher, boolean canBeReadOnly) throws IOException { LOG.info("Initiating client connection, connectString=" + connectString + " sessionTimeout=" + sessionTimeout + " watcher=" + watcher); watchManager.defaultWatcher = watcher; ConnectStringParser connectStringParser = new ConnectStringParser( connectString); HostProvider hostProvider = new StaticHostProvider( connectStringParser.getServerAddresses()); cnxn = new ClientCnxn(connectStringParser.getChrootPath(), hostProvider, sessionTimeout, this, watchManager, getClientCnxnSocket(), canBeReadOnly); cnxn.start(); }
具体的来文字说明,哪能仅是图片啊
(1)watchManager.defaultWatcher = watcher;
这个就是传说中zk需要观察的干货,观察管理者的角色,听着都高大上,原来人家默认支持三 种模式
dataWaches 一看就是监控数据的
existWatchesUI看就是监控节点是否存在等
childWatches 他的闺女儿子的变化的
都是装在map这个大木桶里,让我们看看主要 这里面都是装得啥单元呗--watcher
KeeperState: Disconnected (0), SyncConnected (3), AuthFailed (4), ConnectedReadOnly (5),SaslAuthenticated(6),Expired (-112)
EventType: None (-1), NodeCreated (1),NodeDeleted (2),NodeDataChanged (3),NodeChildrenChanged (4);
大家都能懂
(2)ConnectStringParser connectStringParser = new ConnectStringParser( connectString);
处理ip和port方法 以及初始化 ,反正也是各种规则啊 校验啊,就忽略
包装成 ArrayList<InetSocketAddress> serverAddresses
(3)HostProvider hostProvider = new StaticHostProvider( connectStringParser connectStringParser.getServerAddresses()); //serverAddresses这个有用了
构造一个SimpleHostSet。这是这段代码的目的
(4)cnxn = new ClientCnxn(connectStringParser.getChrootPath(), hostProvider, sessionTimeout, this, watchManager, getClientCnxnSocket(), canBeReadOnly);
启动两个单线程
sendThread 心跳检测 负责链接服务 进去看看
sendThread 总结下:
1. 首先初始化心跳时间,判断是否是第一次连接,如果不是这让改连接暂 时随机停顿一段时间,防止并发操作。
2. 其实开始进行连接准备工作startConnect(),放入outgoingQueue的 发送队列中,添加到第一位
准备中涉及到SASL认证配置 如果出现错误则放入enentThread的 waitingEvents的队列中进行后续处理,在更新心跳时间
3.连接上时 进行SASL认证 同上失败则放入等待处理队列
4.进行clientCnxnSocket.doTransport(to, pendingQueue, outgoingQueue, ClientCnxn.this) 对队列进行一系列的处理工作
5、处理完后清空队列,关闭nio等一系列
eventThread 处理上一步中的返回结果。
未完待续~···