ZooKeeper 序列化机制

Posted 郭朝阳@

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZooKeeper 序列化机制相关的知识,希望对你有一定的参考价值。

ZooKeeper 序列化机制


一、到底在那些地方需要使用序列化技术呢??

  • 1、当在网络中需要进行消息,数据,等的传输,那么这些数据就需要进行序列化和反序列化
  • 2、当数据需要从内存被持久化到磁盘的时候。

二、ZooKeeper(分布式协调服务组件 + 存储系统)

任何一个分布式系统的底层,都必然会有网络通信,这就必然要提供一个分布式通信框架和序列化机制。所以我们在看 ZooKeeper 源码之前,先搞定

ZooKeeper 网络通信和序列化。你知道有哪些序列化方式呢?

  • 1、Java 提供的序列化机制
  • 2、Hadoop 的序列化技术
  • 3、Zookeeper 的序列化
  • 4、Spark 提供的等等序列化。。。。。

1、Java 序列化机制

  • 1、class xxxx implements Serializable
  • 2、序列化过程中:类型信息 + 对象实例的属性值
  • 3、特点就是比较笨重:(除了实例的属性信息以外,还会序列化这个实例的类型信息)
  • 4、Spark 默认使用的序列化机制就是 Java 原生序列化机制,也提供其他的序列化方式,将来在阅读 Spark 源码的时候,再给大家说明下 Spark 的序列化机制!
  • 5、使用 ObjectInputStream 和 ObjectOutputStream 来进行具体的序列化和反序列化。

2、Hadoop 序列化机制

有两种方式:avro(implements Writable) protobuf

Hdfs中使用的序列化就是 avro,Yarn使用的是protobuf

Hadoop的序列化和反序列化中的字段的顺序和多少,一定要严格一样,否则序列化和反序列化就对不上了

class Student implements Writable{ 
// 反序列化 
void readFields(DataIn input);
 // 序列化
  void write(DataOut output); 
 }

3、ZooKeeper 序列化机制

Zk中的序列化和反序列化,没有严格的顺序要求,因为使用tag标记,下面会有简单的demo示例。

class Student implements Record{ 
// 反序列化
 void deserialize(InputArchive archive, String tag) {
  archive.readBytes();
   archive.readInt(); 
   }
// 序列化 
void serialize(OutputArchive archive, String tag) 
}

ZK中序列化就是Record,如果在源码中看到一个类实现了Record接口,那么这个类必然有将数据从磁盘读取到内存和从内存序列化到磁盘的方法。

序列化的 API 主要在 zookeeper-jute 子项目中。

在这里插入图片描述
重点API:
org.apache.jute.InputArchive:反序列化需要实现的接口,其中各种 read 开头的方法,都是反序列化方法
实现类有:
在3.4.x版本之前有三种实现,
在这里插入图片描述
3.5之后的版本 就只有Binary这一种了,主要原因是 CSV和XML这两种实现类没有人使用,如果你们的环境中需要使用这两种实现,就直接从老版本中复制。

org.apache.jute.OutputArchive:所有进行序列化操作的都是实现这个接口,其中各种 write 开头的方法都是序列化方法。

org.apache.jute.Index:用于迭代数据进行反序列化的迭代器

在这里插入图片描述

org.apache.jute.Record:在 ZooKeeper 要进行网络通信的对象,都需要实现这个接口。里面有序列化和反序列化两个重要的方法

/**
 * tag 是一个标记
 * 持久化对象到磁盘的时候: 一个实例 会变成一个抽象的map
 * "id"=>value
 * "name"=>value
 * 我们在阅读 ZKDataBase 冷启动的时候会看到这个机制。
 */

class People implements Record{

    private int age;

    private String name;

    @Override
    public void serialize(OutputArchive archive, String tag) throws IOException {
        archive.writeInt(age,"");
        archive.writeString(name,"");
    }

    @Override
    public void deserialize(InputArchive archive, String tag) throws IOException {
        archive.readInt("");
        archive.readString("");
    }
}

另外一个需要说明的是Index 接口

 * </code>
 *
 * todo 可以把这个当作Iterator就可以了
 */
public interface Index {
    boolean done(); // TODO: 2021/5/16 等同于hasNext()
    void incr();// TODO: 2021/5/16    等同于 next()
}

以上是关于ZooKeeper 序列化机制的主要内容,如果未能解决你的问题,请参考以下文章

zookeeper学习笔记-zkclient,curator使用

SpringCloud系列四:Eureka 服务发现框架(定义 Eureka 服务端Eureka 服务信息Eureka 发现管理Eureka 安全配置Eureka-HA(高可用) 机制Eur(代码片段

zookeeperzookeeper 源码解读

使用zookeeper序列节点实现不可重入的分布式锁

猿创征文|[Zookeeper]快速上手Zookeeper.Zookeeper的初识别,安装,znode节点的理解,常用命令,Wacher机制,ACL权限控制及上述功能在idea的代码实现

Zookeeper-watcher机制源码分析