服务端(服务端接口获取失败)

admin 2021-03-28 传奇手游 142 ℃ 请在这里放置你的在线分享代码
正文

上一篇: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:

网站分类
最近发表
标签列表
传奇手游发布网站