目录
- 序列化与反序列化
- 通信协议
- 请求头的数据结构
- 响应头的数据结构
序列化与反序列化
zookeeper的客户端与服务端、服务端与服务端之间会进行一系列的网络通信,在进行数据的传输过程中就涉及到序列化与反序列化,zookeeper使用Jute作为它的序列化组件,在使用的时候,需要序列化与反序列化的对象实现Record接口并实现该接口的serialize()和deserialize()方法,先看下接口Record:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RO8tixom-1691312271285)(C:\Lanna\技术经验\zookepper\图片\2\1.png)]](https://img-blog.csdnimg.cn/b8ba199c639747fe8e624549a14c0be4.png)
它只有两个方法,分别是serialize()和deserialize(),下面以ReplyHeader为例看下它的使用。
-
- 实现接口Record:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZXkvDbgY-1691312271287)(C:\Lanna\技术经验\zookepper\图片\2\2.png)]](https://img-blog.csdnimg.cn/31598504a8b54a88a7ebb3daa0b2826a.png)
-
- 创建BinaryOutputArchive

-
- 序列化。上一步中调用BinaryOutputArchive的
writeRecord()方法,看下源码:
- 序列化。上一步中调用BinaryOutputArchive的

进入writeRecord()方法调用Record实现类的serialize()方法进行序列化。
-
- 反序列化。创建BinaryInputArchive,调用Record实现类的
deserialize()方法进行反序列。
- 反序列化。创建BinaryInputArchive,调用Record实现类的

以上就是Jute进行序列化与反序列化的基本过程。
通信协议
基于TCP/IP协议,zookeeper实现了自己的通信协议,设计上,客户端与服务端、服务端与服务端之间的网络通信数据结构,对于请求,包含数据总长度、请求头与请求体,对于响应,包含数据总长度、响应头与响应体,如下图。
请求协议:

响应协议:

请求头的数据结构

响应头的数据结构

对于请求体与响应体,不同的请求体和响应体的数据结构是不同的,可以参考/zookeeper-jute/target/generated-sources/java/org/apache/zookeeper/proto该目录下的类。
