1、Java中序列化与反序列化相关
序列化框架 | 类型 | 特点 |
ProtoBuf
| 跨平台、跨语言
| 自定义协议类型,tag[value]形式进行存储,提前预定义字段类型及长度,小整数基于varint记性存储减少存储空间,长整型基于zigzag存储。
|
kryo | 基于java语言的序列化方式 | 类似protobuf,对小整数友好,基于java语言 |
json/gson | 基于json格式的序列化,跨语言 | Jackson2/fastJson/gson,相比xml减少属性描述,校验基于接口。通用的 Json 有固有的性能问题 |
Hessian2 | 跨语言 |
|
xml | 基于xml通用格式 | 字段属性都需定义描述,传输成本较大 |
rpc框架 | 特点 |
paxos | 目标是实现一致性数据状态机 |
zookeeper | 基于PAXOS实现的ZAB(zookeeper atomic broadcast)算法,目标是实现分布式数据的一致性 |
raft | redis-sentinel中实现分布式数据一致性 |
rpc框架 | 优点 | 缺点 |
dubbo | dubbo直接定义在tcp传输协议上的,由于TCP全双工给dubbo提供了很大灵活性 | rpc协议普遍都是定制化的私有协议,dubbo一样,协议通用性方面存在问题:扩展性不够好,java版本存在冗余,语言绑定,不够精简与通用 |
http/1.1 | 直接构建在http协议上解决方案就有更好通用性。
|
|
http/2 | http/2保留http/1.1所有语义,在通信模型与传输效率有更大改进
|
|
gRPC | HTTP 及 TCP 协议之上构建 RPC 协议各自的优缺点,相比于 Dubbo 构建于 TPC 传输层之上,Google 选择将 gRPC 直接定义在 HTTP/2 协议之上。
在这样的设计理念指导下,gRPC 最终被设计为一个跨语言、跨平台的、通用的、高性能的、基于 HTTP/2 的 RPC 协议和框架 | 易用性不足以及服务治理能力欠缺 |
thrift | 下面是 Thrift 的主要组件: Thrift 的接口定义语言(IDL)——用来定义你的服务,并且编排你的服务将要发送和接收的任何自定义类型; 协议——用来控制将数据元素编码/解码为一个通用的二进制格式(如 Thrift 的二进制协议或者 JSON); 传输—提供了一个用于读/写不同媒体(如 TCP 套接字、管道、内存缓冲区)的通用接口; Thrift 编译器——解析 Thrift 的 IDL 文件以生成用于服务器和客户端的存根代码,以及在IDL 中定义的自定义类型的序列化/反序列化代码; 服务器实现—处理接受连接、从这些连接中读取请求、派发调用到实现了这些接口的对象,以及将响应发回给客户端; 客户端实现——将方法调用转换为请求,并将它们发送给服务器。 |
|
参考文档: