承接上一篇,接着来说通信协议部分;
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客户端发送的请求和响应进行抓包,分析数据;
Zookeeper内部实现分布式数据一致性(序列化和协议)(五)
原文:https://www.cnblogs.com/startelk/p/11793727.html