Zookeeper内部实现分布式数据一致性(序列化和协议)(五)

承接上一篇,接着来说通信协议部分;

  Zookeeper基于TCP/IP协议,实现了自己的通信协议来完成客户端与服务端,服务端与客户端之前的网络通信;

    Zookeeper的请求和响应的结构:(请求/响应)头+(请求/响应)体;

1. 请求部分

  请求头:包含了请求的最基本信息,xid和type;

module org.apache.zookeeper.proto{
     class RequesHeader{
            int xid;
            int type;
     }    
}

    <1> xid用户记录客户端请求发起的先后顺序,用来确单个客户端请求的响应顺序

    <2> type代表请求的操作类型,常见的包括:

        创建节点:1,删除节点:2,获取节点数据:4。

        根据协议规定,除非是会话创建请求,其他客户端请求都会带上请求头;

  
  请求体:包含请求的所有操作内容,不同的请求类型,请求部分的结构是不同的;

    <1> 会话创建请求;

//ConnectRequest
module org.apache.zookeeper.proto{
     class ConnectRequest{
           int protocolVersion; //协议的版本号
           long lastZxidSeen; //最近一次收到服务器的ZXID
           int timeOut; //会话超时时间
           long sessionId; //会话标识
           buffer passwd; //会话密码
     }
}    

   <2> 除此之外还有获取节点数据的请求,更新节点数据的请求。这里就不一一列出源码介绍了;

      获取节点数据的请求体中包含:数据节点路径Path和是否注册Watcher的表示watch;

      更新数据节点的请求体中包含:数据节点的路径path,数据内容data和节点数据的期望版本号version;

2 . 响应部分:

  <1>响应头:包含xid和zxid和err

   其中,xid和请求头中的xid是一致的,响应中只是将请求中的xid原值返回。zxid代表Zookeeper上当前最新的事务ID。err则是一个错误码,当请求过程处理异常的时候,会在这个错误码中标识处理;

  <2>响应体:

    与请求体对应:ConnectResponse:会话创建响应;

      GetDataRespinse:获取节点数据;响应体中包含了节点数据内容data和节点状态stat;

      SetDataResponse:更新节点数据:响应体包含最新节点的状态stat;

备注:协议部分大致介绍完了;

  读者可以使用Wireshark工具,进行网络抓包。对Zookeeper客户端发送的请求和响应进行抓包,分析数据;

猜你喜欢

转载自www.cnblogs.com/startelk/p/11793727.html
今日推荐