美文网首页
Zookeeper通信协议

Zookeeper通信协议

作者: 鸿雁长飞鱼龙潜跃 | 来源:发表于2019-06-06 13:53 被阅读0次

    我们这里的讨论是建立在版本3.4.6的基础之上的。

    zookeeper-3.4.6.jar下,有一个单独的目录,叫proto,这个就是zookeeper通信协议的主要实现源码。我们的讨论,就是建立在这些源码之上的。

    一,请求/响应协议报文结构

    Zookeeper的请求/响应协议报文结构简单来说由3部分组成。

    len:报文长度。

    报文头:请求报文头/响应报文头。

    报文体:请求报文体/响应报文体。

    请求报文详细结构如下:

    Zookeeper通信协议

    各个属性字段的含义:

    len:整个请求数据包的长度,占3个字节。

    xid:请求头的一部分,代表客户端请求的发起序号。什么意思呢?我的理解就是标识客户端的请求次数。

    type:请求头的一部分,客户端请求类型,type值为4代表的是OpCode.getData。

    请求体中的len:请求体的长度。

    path:报文体的一部分,代表节点路径

    watch:报文体的一部分,代表是否注册watch,值为1代表注册,值为0代表不注册。

    响应报文详细结构如下:

    图片稍后补上。

    各个属性字段的含义:

    len:整个请求数据包的长度,占3个字节。

    xid:报文头的一部分,代表客户端请求的发起序号。什么意思呢?我的理解就是标识客户端的请求次数。代表客户端会话创建后,发送的第N次请求。

    zxid,报文头的一部分,代表当前服务端处理过的最新的时间戳值。

    err,报文头的一部分,代表错误码,0代表Code.OK。

    报文体中的len:报文体的一部分,代表报文体的长度。

    data,报文体的一部分,代表节点的数据内容。

    czxid,报文体的一部分,代表创建该节点时的zxid。

    mzxid,报文体的一部分,代表最后一次修改该节点时的zxid。

    ctime,报文体的一部分,代表节点的创建时间。

    mtime,报文体的一部分,代表最后一次修改该节点时的时间。

    version,报文体的一部分,代表节点的内容的版本号。

    cversion,报文体的一部分,代表节点的子节点的版本号。

    aversion,报文体的一部分,代表节点的ACL变更版本号。

    ephemeralOwner,报文体的一部分,如果节点是临时节点,则记录创建该临时节点的会话ID,如果是持久节点,则为0。

    dataLength,报文体的一部分,代表节点的内容长度。

    numChildren,报文体的一部分,代表节点的子节点个数。

    pzxid,报文体的一部分,代表最后一次对子节点列表变更的pzxid。

    二,请求/响应协议具体实现

    重点关注以下几个类:

    请求报文头实现类

    RequestHeader

    响应报文头实现类

    ReplyHeader

    创建连接的协议实现类

    ConnectRequest

    ConnectResponse

    请求节点数据的协议实现类

    GetDataRequest

    GetDataResponse

    创建节点的协议实现类

    CreateRequest

    CreateResponse

    更新节点数据的协议实现类

    SetDataRequest

    SetDataResponse

    这些类都继承了Zookeeper的序列化接口Record,因为再进行网络传输前,都要先进行序列化。

    首先来看创建连接的协议实现类

    ConnectRequest定义了5个字段,分别是:

    protocalVersion,协议的版本号。

    lastZxidSeen,最近一次接收到的服务器ZXID。

    timeOut,会话超时时间。

    sessionId,会话标识。

    passwd,会话密码。

    ConnectResponse定义了2个字段,分别是:

    data:节点的数据。

    stat:节点的状态。

    其他的协议都和这个类似,这里不在赘述。另外需要注意,报文头是单独定义的,和报文体是分开的。因为报文头是公用的,抽取出来单独定义,方便复用。

    Zookeeper通信协议这一块内容相对而言还是简单的。主要内容就是定义Zookeeper节点之间通信的细节和序列化反序列化方式,是Zookeeper集群的基础,后续集群的各种操作都是都是通过这些通信协议来工作的。

    相关文章

      网友评论

          本文标题:Zookeeper通信协议

          本文链接:https://www.haomeiwen.com/subject/gjayxctx.html