上一篇:ZooKeeper源码分析(十)Leader与Follower之间如何进行数据同步
既然要看客户端和服务端的连接,我们就先要找到zk客户端是那个类,在之前的源码分析中,我们了解到创建一个客户端其实就是创建一个ZooKeeper,这个就代表了一个zk客户端
我们再来看一下ZooKeeper的构建方法
构造方法里面最重要的就是创建了一个ClientCnxn的线程,并且将其启动了
我们先来看一下ClientCnxn的构造方法
这个构造方法里面又会创建2个比较重要的线程,一个是用来发消息的,一个是用来接收消息的,其中SendThread线程很重要;
我们看完了ClientCnxn的构造方法,在来看一下他后面马上跟着的start方法,这里其实就直接调用了之前2个线程的start方法将他们启动;说明主要逻辑都在那个2个线程里面
我们发现其实与服务端建立连接的逻辑就在SendThread线程的run方法中,所以这个线程比较重要;
连接的时候会从zk服务端列表随机选择一台机器进行连接
我们在来看一下这个实际进行连接的一个方法:clientCnxnSocket.connect(addr);
就这么几行代码,这个就是目前使用最广的中间件生产级网络通信的代码,以后我们做网络通信连接的时候就可以仿造这个代码
创建了SocketChannel之后就开始进行连接了,将SocketChannel注册到Selector上面并监听连接请求,在调用sock.connect(addr)请求zk服务端进行连接
我们再来看一下zk服务端是怎么处理连接请求的,还记得我们最开始讲的QuorumPeerMain中的集群启动的代码吗?这个里面会创建一个ServerCnxnFactory,这个就是与客户端建立连接的类;
createFactory方法里面实际会创建NIOServerCnxnFactory类
在调用quorumPeer.start();方法时就会将NIOServerCnxnFactory启动,为什么是启动,没错,NIOServerCnxnFactory其实就是一个线程,只是名称有点。。
NIOServerCnxnFactory的run方法其实就是不断的循环,通过selector.selectedKeys()方法将所有SelectionKey取出来,去判断是否有请求进来,如果有连接请求进来则会将代表节点通信的SocketChannel注册重新注册到selector上面去,并且告诉selector监听读请求
在创建一个NIOServerCnxn,里面封装SocketChannel和SelectionKey,并添加到HashSet里面去,这样的话如果zk服务端想给zk客户端发送回调消息就可以通过这个HashSet集合里面的SocketChannel和SelectionKey去发送数据了;
到这里,客户端和zk服务端就正式建立的连接;
我们发现在zk客户端在连接成功之后还有一些逻辑,有什么sessionId什么的,为什么,因为连接建立成功了还不够,zk还有一个session机制,后续心跳机制,重连机制,故障感知,超时机制、清理机制等等都是基于session来的,今天先到这里,后续更精彩;
本文TAG:服务端
- 上一篇: 火炬之光2最强装备的简单介绍
- 下一篇: ios手游今日开服时间表(ios今日最新手游开服表)
猜你喜欢
- 2023-11-091.85灵陵传奇手游
- 2023-10-291.85蜀山忘忧传奇手游
- 2023-10-171.85大乾霸业传奇手游
- 2023-10-071.80封魔主宰传世传奇手游
- 2023-09-241.80锦云合击传奇手游
- 2023-09-141.95双星无限刀超超变传奇手游
- 最近发表
- 标签列表
-
- 传奇手游 (5)
- 冰雪传奇手游 (3)
- 合击传奇手游 (6)
- 单职业传奇 (11)
- 复古传奇 (42)
- 合击传奇 (107)
- 火龙传奇 (7)
- 合击 (34)
- 沉默 (2)
- 大极品传奇 (8)
- 复古传奇手游 (16)
- 神途手游 (2)
- 1.80火龙 (2)
- 三职业传奇 (85)
- 1.80 (224)
- 1.76 (101)
- 1.85 (58)
- 三职业 (22)
- 火龙 (65)
- 复古 (92)
- 微变 (20)
- 战神 (12)
- 单职业 (5)
- 金币 (13)
- 1.82 (9)
- 微变版本 (2)
- 大极品 (4)
- 复古小极品 (3)
- 微变传奇 (10)
- 战神传奇 (2)
- 变态 (9)
- 1.79 (7)
- 1.95 (47)
- 1.70 (4)
- 小极品传奇 (3)
- 1.78 (3)
- 暗黑 (2)
- 1.80-85 (2)
- 三职业传奇手游 (19)
- 微变传奇手游 (7)
- 火龙传奇手游 (10)
- 迷失传奇手游 (5)
- 无限刀传奇手游 (27)
- 专属传奇手游 (7)
- 单职业传奇手游 (11)
- 宠物传奇手游 (2)
- 金币传奇手游 (2)
- 沉默传奇手游 (3)
- 神器传奇手游 (8)
- 单职业传说手游 (2)