zookeeper源码之请求协议

Posted zwh1988

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了zookeeper源码之请求协议相关的知识,希望对你有一定的参考价值。

Packet

  包,ClientCnxn内部管理请求内容的模块。由以下几个模块组成:

  1.RequestHeader header 请求头

  2.Record request 请求内容

  3.ByteBuffer bb 实际需要发送的请求内容。

  4.ReplyHeader replyHeader 响应头

  5.Record response 响应内容

  6.String clientPath

  7.String serverPath 

  8.boolean finished

  9.AsyncCallback cb

  10.Object ctx 

  11.WatchRegistration watchRegistration 

Packet(RequestHeader header, ReplyHeader replyHeader, Record record,
                Record response, ByteBuffer bb,
                WatchRegistration watchRegistration) {
            this.header = header;
            this.replyHeader = replyHeader;
            this.request = record;
            this.response = response;
            if (bb != null) {
                this.bb = bb;
            } else {
                try {
                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    BinaryOutputArchive boa = BinaryOutputArchive
                            .getArchive(baos);
                    boa.writeInt(-1, "len"); // We‘ll fill this in later
                    header.serialize(boa, "header");
                    if (record != null) {
                        record.serialize(boa, "request");
                    }
                    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);
                }
            }
            this.watchRegistration = watchRegistration;
        }

请求头RequestHeader

  包含一下两部分内容

  1.int xid 包序号,唯一标识一个包。

  2.int type 操作类型 

0 notification  
1 create 创建节点
2 delete 删除节点
3 exists 是否存在指定节点
4 getData 获取节点数据
5 setData 设置节点数据
6 getACL 获取节点权限
7 setACL 设置节点权限
8 getChildren 获取子节点
9 sync  
11 ping  
12 getChildren2  
100 auth  
101 setWatches  
-10 createSession  
-11 closeSession  
-1 error  

请求内容Record

  根据不同的操作类型有不同的请求对象。

 请求类型  字段 解释 
ExistsRequest    String path 路径
 boolean watch  
GetChildrenRequest   String path 路径 
 boolean watch  
CreateRequest     String path 路径
 byte[] data 节点值
List<ACL> acl acl值
 int flags 节点类型
GetDataRequest String path 路径
boolean watch  
DeleteRequest String path 路径
int version 版本
SetDataRequest   String path 路径
byte[] data 数据
int version 版本 
GetACLRequest String path 路径
SetACLRequest String path 路径
List<ACL> acl acl值
int version 版本
SyncRequest String path 路径

实际请求传输字节ByteBuffer bb 

名称 类型
len int
header RequestHeader
request Record

响应头ReplyHeader

名称 类型 解释
xid int 包序号,唯一标识一个包,通过该标识找到对应的客户端Packet对象
zxid long  
err int 是否为异常,如果返回0,则非异常,不为0则异常。

响应内容Record

  根据不同的请求类型有不同的响应内容对象。

 返回类型 字段  解释 

GetChildrenResponse

 List<String> children  子节点名
CreateResponse String path 路径
GetDataResponse  byte[] data 节点数据
Stat stat 节点状态信息 
SetDataResponse Stat stat 节点的状态信息
GetACLResponse  List<ACL> acl 权限 
Stat stat 节点的状态信息
SetACLResponse  Stat stat 节点的状态信息
SyncResponse String path 路径

实际响应内容传输字节

 

以上是关于zookeeper源码之请求协议的主要内容,如果未能解决你的问题,请参考以下文章

zookeeper(16)源码分析-ZAB协议

Zookeeper之Zab协议

zookeeper源码之客户端网络通信模块

Zookeeper Session源码

ZooKeeper客户端源码——向服务端发起请求(顺序响应+同步阻塞+异步回调)

Dubbo推刊