文档章节

Thrift RPC实战(三) Thrift序列化机制

lemonLove
 lemonLove
发布于 06/20 20:21
字数 1032
阅读 81
收藏 0

1.Thrift基础架构    

Thrift是一个客户端和服务端的架构体系,数据通过socket传输;

具有自己内部定义的传输协议规范(TProtocol)和传输数据标准(TTransports);

通过IDL脚本对传输数据的数据结构(struct) 和传输数据的业务逻辑(service)根据不同的运行环境快速的构建相应的代码;

通过自己内部的序列化机制对传输的数据进行简化和压缩提高高并发、 大型系统中数据交互的性能。

  (1)  Thrift 数据类型

基本类型:
  bool: 布尔值
  byte: 8位有符号整数
  i16: 16位有符号整数
  i32: 32位有符号整数
  i64: 64位有符号整数
  double: 64位浮点数
  string: UTF-8编码的字符串
  binary: 二进制串
结构体类型:
  struct: 定义的结构体对象
容器类型:
  list: 有序元素列表
  set: 无序无重复元素集合
  map: 有序的key/value集合
异常类型:
  exception: 异常类型
服务类型:
  service: 具体对应服务的类

  (2)  协议

Thrift可以让你选择客户端与服务端之间传输通信协议的类别,在传输协议上总体上划分为文本(text)和二进制(binary)传输协议, 为节约带宽,提供传输效率,一般情况下使用二进制类型的传输协议为多数,但有时会还是会使用基于文本类型的协议,这需要根据项目/产品中的实际需求:
    1、TBinaryProtocol – 二进制编码格式进行数据传输。
    2、TCompactProtocol – 这种协议非常有效的,使用Variable-Length Quantity (VLQ) 编码对数据进行压缩。
    3、TJSONProtocol – 使用JSON的数据编码协议进行数据传输。
    4、TSimpleJSONProtocol – 这种节约只提供JSON只写的协议,适用于通过脚本语言解析
    5、TDebugProtocol – 在开发的过程中帮助开发人员调试用的,以文本的形式展现方便阅读。

(3)传输层

    1、TSocket- 使用堵塞式I/O进行传输,也是最常见的模式。
    2、TFramedTransport- 使用非阻塞方式,按块的大小,进行传输,类似于Java中的NIO。
    3、TFileTransport- 顾名思义按照文件的方式进程传输,虽然这种方式不提供Java的实现,但是实现起来非常简单。
    4、TMemoryTransport- 使用内存I/O,就好比Java中的ByteArrayOutputStream实现。

    5、TZlibTransport- 使用执行zlib压缩,不提供Java的实现。

(3)服务服务模型

        https://my.oschina.net/u/3737136/blog/1833054

2.Thrift序列化机制

Thrift提供了可扩展序列化机制, 不但兼容性好而且压缩率高。

   thrift 数据格式描述

   thrift的向后兼容性(Version)借助属性标识(数字编号id + 属性类型type)来实现, 可以理解为在序列化后(属性数据存储由 field_name:field_value => id+type:field_value)

 我们定义IDL文件形如

namespace java stu.thrift;
 
struct User {
  1: required string name
  2: required string address
}

thrift的向后兼容性(Version)借助属性标识(数字编号id + 属性类型type)来实现, 可以理解为在序列化后(属性数据存储由 field_name:field_value => id+type:field_value), 这也解释了上述提到的场景的原因了.
 进行代码解读:

public void read(org.apache.thrift.protocol.TProtocol iprot, User struct) throws org.apache.thrift.TException {
  org.apache.thrift.protocol.TField schemeField;
     //读取结构开始标记
  iprot.readStructBegin();
  while (true)
  {
    // 读取Field属性开始标记
    schemeField = iprot.readFieldBegin();
    if (schemeField.type == org.apache.thrift.protocol.TType.STOP) { 
      break;
    }
    switch (schemeField.id) {
      case 1: // name
        if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
          struct.name= iprot.readString();
          struct.setNameIsSet(true);
        } else { 
          org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
        }
        break;
      case 2: // address
        if (schemeField.type == org.apache.thrift.protocol.TType.STRING) {
          struct.address= iprot.readString();
          struct.setAddressIsSet(true);
        } else { 
          org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
        }
        break;
      default:
        org.apache.thrift.protocol.TProtocolUtil.skip(iprot, schemeField.type);
    }
    iprot.readFieldEnd();
  }
  iprot.readStructEnd();

  // check for required fields of primitive type, which can't be checked in the validate method
  struct.validate();
}

最终会被细化为readStructBegin, readFieldBegin, read<type>(readString, readI32, readI64), readFieldEnd, readStructEnd的有组织有序调用.

Thrift官方文档, 也提到对新增的字段属性, 采用id递增的方式标识并以optional修饰来添加.

 

© 著作权归作者所有

共有 人打赏支持
lemonLove
粉丝 33
博文 61
码字总数 67079
作品 0
深圳
后端工程师
私信 提问
Thrift RPC 框架分析

前言 工作中用到Thrift,一直想深入研究一下。今天这篇博客以提问的方式,分析Thrift的源码。文章部分参考自:Thrift源码分析。 本来计划的题目是:「Thrift RPC 源码分析」,可是写了两个小...

被称为L的男人
12/01
0
0
thrift使用介绍

原文出处:http://gemantic.iteye.com/blog/1199214 一、About thrift 二、什么是thrift,怎么工作? 三、Thrift IDL 四、Thrift Demo 五、Thrift 协议栈 以及各层的使用(java 为例) 六、与...

ponpon_
2014/07/07
0
0
Thrift之Protocol源码分析

 之前写过两篇关于 Thrift 的相关文章。 Thrift源码剖析 Thrift异步IO服务器源码分析 也算是对Thrift比较熟悉,不过对 Thrift 里面的 Protocol 部分还是黑盒使用。 虽然大概能猜到具体实...

nothingfinal
2016/04/23
0
0
架构设计:系统间通信(12)——RPC实例Apache Thrift 中篇

(接上文《架构设计:系统间通信(11)——RPC实例Apache Thrift 上篇》) 3、Aapche Thrift详解 在《架构设计:系统间通信(10)——RPC的基本概念》一文中,我专门介绍了一款RPC规范的具体...

引鸩怼孑
2016/01/29
38
0
thrift中使用list数据类型传输大数据瓶颈及解决方案

董的博客中thrift相关基础的介绍:http://dongxicheng.org/search-engine/thrift-rpc/ thrift碰到大list时瓶颈的原因: 因为thrift协议中server和client的交互使用的是序列化的数据。当你使用...

liujiest
2016/09/01
197
0

没有更多内容

加载失败,请刷新页面

加载更多

不用编写程序代码,送你一个爬虫程序批量采集猫眼电影票房数据

"大数据"是一个体量特别大,数据类别特别大的数据集,并且这样的数据集无法用传统数据库工具对其内容进行抓取、管理和处理。 "大数据"首先是指数据体量(volumes)大,指代大型数据集,一般在1...

技术阿飞
16分钟前
0
0
【Flutter教程】从零构建电商应用(一)

在这个系列中,我们将学习如何使用google的移动开发框架flutter创建一个电商应用。本文是flutter框架系列教程的第一部分,将学习如何安装Flutter开发环境并创建第一个Flutter应用,并学习Flu...

笔阁
38分钟前
5
0
什么是以太坊DAO?(三)

Decentralized Autonomous Organization,简称DAO,以太坊中重要的概念。一般翻译为去中心化的自治组织。 投票支付合约的所有费用和行动需要时间,并要求用户始终保持活跃,知情和专注。另一...

geek12345
39分钟前
2
0
一个本科学生对Linux的认知

一个本科学生对Linux的认知 我是一名大三的普通一本大学的软件工程的一名学生,学校开设了一些关于系统开发的课程,纸上得来终觉浅,学校的课程课时较短,想要在56个课时之内学会一些公司需要...

linuxCool
今天
3
0
CentOS 安装Tomcat

Tomcat 介绍 Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目,由Apache、Sun和其他一些公司及个人共同开发而成。 Java 程序写的网站用tomcat+jdk来运...

野雪球
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部