文档章节

zk源码阅读2:序列化

beyondflyh
 beyondflyh
发布于 2017/09/07 09:48
字数 730
阅读 4
收藏 0

摘要

本来先讲数据存储的,但是绕不开序列化,因为在网络通信、数据存储中都用到了序列化。 这一节就讲zk的序列化

简介

Zookeeper从最早的版本开始就一直使用Jute作为序列化工具,直到现在最新的版本zookeeper-3.4.9依然使用Jute;至于为什么没有换成性能更好,通用性更强的如:Apache Avro,Thrift,Protobuf等序列化组件,主要还是由于考虑到新老版本序列化组件的兼容性,另一方面Jute并没有成为Zookeeper的瓶颈所在;

序列化主要在zookeeper.jute包中, 主要是

InputArchive:反序列化器要实现的接口
OutputArchive:序列化器需要实现的接口
Index:反序列化器的迭代器
Record:用于网络传输或者本地存储的类型都实现该接口

接口介绍

InputArchive

public interface InputArchive {
    public byte readByte(String tag) throws IOException;
    public boolean readBool(String tag) throws IOException;
    public int readInt(String tag) throws IOException;
    public long readLong(String tag) throws IOException;
    public float readFloat(String tag) throws IOException;
    public double readDouble(String tag) throws IOException;
    public String readString(String tag) throws IOException;
    public byte[] readBuffer(String tag) throws IOException;
    //读取特定tag的record
    public void readRecord(Record r, String tag) throws IOException;
    //读取特定tag的record之前干的事情
    public void startRecord(String tag) throws IOException;
    //读取特定tag的record之后干的事情
    public void endRecord(String tag) throws IOException;
    //开始读取向量
    public Index startVector(String tag) throws IOException;
    //结束读取向量
    public void endVector(String tag) throws IOException;
    //开始读取map
    public Index startMap(String tag) throws IOException;
    //结束读取map
    public void endMap(String tag) throws IOException;
}

这里除了基础类型,容器以外就是record,下面会介绍这种类型以及Index

InputArchive实现类

OutputArchive

public interface OutputArchive {
    public void writeByte(byte b, String tag) throws IOException;
    public void writeBool(boolean b, String tag) throws IOException;
    public void writeInt(int i, String tag) throws IOException;
    public void writeLong(long l, String tag) throws IOException;
    public void writeFloat(float f, String tag) throws IOException;
    public void writeDouble(double d, String tag) throws IOException;
    public void writeString(String s, String tag) throws IOException;
    public void writeBuffer(byte buf[], String tag)
        throws IOException;
    public void writeRecord(Record r, String tag) throws IOException;
    public void startRecord(Record r, String tag) throws IOException;
    public void endRecord(Record r, String tag) throws IOException;
    public void startVector(List v, String tag) throws IOException;
    public void endVector(List v, String tag) throws IOException;
    public void startMap(TreeMap v, String tag) throws IOException;
    public void endMap(TreeMap v, String tag) throws IOException;

}

这里就不加注释了,和InputArchive 相反就是了

OutputArchive 实现类

index

public interface Index {
    // 是否已经完成
    public boolean done();
    // 下一项
    public void incr();
}

index 实现类

Record

public interface Record {
    // 序列化
    public void serialize(OutputArchive archive, String tag) throws IOException;
    // 反序列化
    public void deserialize(InputArchive archive, String tag) throws IOException;
}

这个实现类就很多了

思考

对demo感兴趣的,看下面的refer就好了 jute这个序列化组件,目前就看到在zk上面用,倒是让我对protobuf这个序列化工具产生兴趣,后续专门讲序列化的时候,再研究好了

refer

http://www.cnblogs.com/leesf456/p/6278853.html jute序列化与protoBuf性能对比 http://blog.csdn.net/quhongwei_zhanqiu?viewmode=contents

© 著作权归作者所有

共有 人打赏支持
beyondflyh
粉丝 0
博文 2
码字总数 3332
作品 0
深圳
程序员
使用zookeeper序列节点实现不可重入分布式锁

一、前言 在同一个jvm进程中时,可以使用JUC提供的一些锁来解决多个线程竞争同一个共享资源时候的线程安全问题,但是当多个不同机器上的不同jvm进程共同竞争同一个共享资源时候,juc包的锁就...

加多
01/12
0
0
simpleRpc解析-服务端

本文主要是对勇哥的simpleRpc进行了简单的剖析,用来学习rpc,加深对rpc的理解! 源码地址:http://git.oschina.net/huangyong/rpc 勇哥博客:https://my.oschina.net/huangyong/blog/36175...

涩谷直子
06/22
0
0
Motan源码阅读--初识Motan

Motan Motan是一套高性能,易于使用的RPC框架。提供了服务治理,包括服务节点自动发现,摘除,高可用和负载均衡。Motan具有良好扩展性,主要模块都提供了不同实现,例如多种注册中心,多种r...

春哥大魔王的博客
08/24
0
0
zookeeper数据迁移失败求解答

原创:转载请:http://my.oschina.net/u/1760714/blog/655124 通过查看从PAXOS到ZOOKEEPER分布式一致性原理与实践以及阅读相关源码,今天终于知道为什么会失败。 科普zookeeper领导者选举的过...

杭电任宇翔
2016/04/08
257
0
【Kafka源码】Kafka代码模块

Kafka源码依赖于Scala环境,首先需要安装scala,这块请自行百度进行安装。 传送门 当然,我们要分析源码,需要下载源码,请自行从github上面下载。 说明:本文使用的kafka版本为0.10.0.1,这...

端木轩
2017/10/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

为什么Java大神,都在看Spring Boot和Spring Cloud的书?

如果你是一名Java开发人员,并且最近正打算学习Spring Boot和Spring Cloud框架并寻找一些关于它们的最好的书籍,那么,你今天就来对地方了。 本文,我们将讨论一些学习Spring Boot和Spring ...

Java小铺
19分钟前
6
0
springboot logback日志配置

springboot 如果不使用外部tomcat的话,日志是需要自己配置的,不然的话就只有控制台的日志,但是日志又是我们在项目上了生产环境,出问题时,检查问题的唯一途径,所以我们要配置详细的日志...

曾大大胖
20分钟前
2
0
Linux服务器集体篡改时间的方法

Red Hat 虚拟化课程RH318,中小型公司使用的话,感觉可以匹敌OpenStack。手头上有一个VMware的映像,RHEV 3.5版的,只能把系统时间调整到2016年才能使用。Red Hat的RHEV已经更新到4.1版,不过...

大别阿郎
20分钟前
1
0
Tomcat启动异常:java.lang.ClassNotFoundException

警告: Name = mysqlDataSource Property maxActive is not used in DBCP2, use maxTotal instead. maxTotal default value is 8. You have set value of "100" for "maxActive" property, wh......

hengbao5
21分钟前
1
0
GO错误的一些处理(defer,recover,panic)

package main import("fmt""errors")func main() {num := 10fmt.Printf("num的类型%T, num的值%v, num的地址%v\n", num, num, &num)num2 := new(int) //返回一个指针//num...

汤汤圆圆
30分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部