摘要
这一节开始讲解client的网络I/O,首先讲解网络IO通信中,传输的数据结构Packet
Packet可以理解为client和server之间的通信数据结构(可以理解为通信元)
概述
ClientCnxn
ClientCnxn是Zookeeper客户端中负责维护客户端与服务端之间的网络连接并进行一系列网络通信的核心工作类
Packet
Packet是ClientCnxn内部定义的一个堆协议层的封装,用作Zookeeper中请求和响应的载体。Packet包含了请求头(requestHeader)、响应头(replyHeader)、请求体(request)、响应体(response)、节点路径(clientPath/serverPath)、注册的Watcher(watchRegistration)等信息
然而,并非Packet中所有的属性都在客户端与服务端之间进行网络传输,只会将requestHeader、request、readOnly三个属性序列化,并生成可用于底层网络传输的ByteBuffer,其他属性都保存在客户端的上下文中,不会进行与服务端之间的网络传输。
Packet类介绍
类图如下
Packet类图
主要属性如下
RequestHeader requestHeader;//请求头
ReplyHeader replyHeader;//响应头
Record request;//请求体
Record response;//响应体
ByteBuffer bb;//序列化之后的byteBuffer
/** Client's view of the path (may differ due to chroot) **/
String clientPath;//client节点路径,不含chrootPath
/** Servers's view of the path (may differ due to chroot) **/
String serverPath;//server节点路径,含chrootPath
boolean finished;//是否结束(已经得到响应才能结束)
AsyncCallback cb;//异步回调
Object ctx;//上下文
WatchRegistration watchRegistration;//注册的watcher
public boolean readOnly;//只读
主要方法createBB如下
public void createBB() {//序列化创建byteBuffer记录在bb字段中
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
BinaryOutputArchive boa = BinaryOutputArchive.getArchive(baos);
boa.writeInt(-1, "len"); // We'll fill this in later
if (requestHeader != null) {
requestHeader.serialize(boa, "header");//序列化请求头,包含xid和type
}
if (request instanceof ConnectRequest) {
request.serialize(boa, "connect");
// append "am-I-allowed-to-be-readonly" flag
boa.writeBool(readOnly, "readOnly");
} else if (request != null) {
request.serialize(boa, "request");//序列化request(对于特定请求如GetDataRequest,包含了是否存在watcher的标志位)
}
baos.close();
this.bb = ByteBuffer.wrap(baos.toByteArray());
this.bb.putInt(this.bb.capacity() - 4);
this.bb.rewind();
} catch (IOException e) {
LOG.warn("Ignoring unexpected exception", e);
}
}
可以看出序列化只有requestHeader,request以及readOnly,并不包含其他属性字段
问题
requestHeader中数据结构xid和type的意义
refer
http://www.voidcn.com/blog/aBOUNTWINTER/article/p-6400711.html
http://www.cnblogs.com/leesf456/p/6098255.html
https://my.oschina.net/pingpangkuangmo/blog/486780
《paxos到zk》