Thrift协议

Thrift自下到上可以分为4

Server(single-threaded, event-driven etc)

服务器进程调度

Processor(compiler generated)

RPC接口处理函数分发,IDL定义接口的实现将挂接到这里面

Protocol (JSON, compact etc)

协议

Transport(raw TCP, HTTP etc)

网络传输

Thrift实际上是实现了C/S模式,通过代码生成工具将接口定义文件生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语言的支持。用户在Thirft描述文件中声明自己的服务,这些服务经过编译后会生成相应语言的代码文件,然后用户实现服务(客户端调用服务,服务器端提服务)便可以了。其中protocol(协议层, 定义数据传输格式,可以为二进制或者XML等)和transport(传输层,定义数据传输方式,可以为TCP/IP传输,内存共享或者文件共享等)被用作运行时库。

Thrift支持的传输及服务模型

支持的传输格式:

参数 描述

TBinaryProtocol 二进制格式

TCompactProtocol 压缩格式

TJSONProtocol JSON格式

TSimpleJSONProtocol 提供JSON只写协议, 生成的文件很容易通过脚本语言解析。

TDebugProtocol 使用易懂的可读的文本格式,以便于debug

支持的数据传输方式:

参数 描述

TSocket 阻塞式socker

TFramedTransport 以frame为单位进行传输,非阻塞式服务中使用。

TFileTransport 以文件形式进行传输。

TMemoryTransport 将内存用于I/O. java实现时内部实际使用了简单的ByteArrayOutputStream。

TZlibTransport 使用zlib进行压缩, 与其他传输方式联合使用。当前无java实现。

支持的服务模型:

参数 描述

TSimpleServer 简单的单线程服务模型,常用于测试

TThreadPoolServer 多线程服务模型,使用标准的阻塞式IO。

TNonblockingServer 多线程服务模型,使用非阻塞式IO(需使用TFramedTransport数据传输方式)

基本类型

  • bool: 布尔值 (true or false), one byte
  • byte:  有符号字节
  • i16:  16位有符号整型
  • i32:  32位有符号整型
  • i64:  64位有符号整型
  • double: 64位浮点型
  • string: Encoding agnostic text or binary string
  • struct结构体  thrift中struct是定义为一种对象,和面向对象语言的class差不多.,但是struct有以下一些约束:

struct不能继承,但是可以嵌套,不能嵌套自己。

1. 其成员都是有明确类型

2. 成员是被正整数编号过的,其中的编号使不能重复的,这个是为了在传输过程中编码使用。

3. 成员分割符可以是逗号(,)或是分号(;),而且可以混用,但是为了清晰期间,建议在定义中只使用一种,比如C++学习者可以就使用分号(;)。

4. 字段会有optional和required之分和protobuf一样,但是如果不指定则为无类型–可以不填充该值,但是在序列化传输的时候也会序列化进去, 
   optional是不填充则部序列化,required是必须填充也必须序列化

5. 每个字段可以设置默认值 
6. 同一文件可以定义多个struct,也可以定义在不同的文件,进行include引入。

Expand source

  • 容器(Containers

Thrift3种可用容器类型:

    1. list(t): 元素类型为t的有序表,容许元素重复。
    2. set(t):元素类型为t的无序表,不容许元素重复。对应c++中的set,java中的HashSet,python中的set,php中没有set,则转换为list类型。
    3. map(t,t): 键类型为t,值类型为t的kv对,键不容许重复。对用c++中的map, Java的HashMap, PHP 对应 array, Python/Ruby 的dictionary。

容器中元素类型可以是除了service外的任何合法Thrift类型(包括结构体和异常)。为了最大的兼容性,map的key最好是thrift的基本类型,有些语言不支持复杂类型的key,JSON协议只支持那些基本类型的key。 容器都是同构容器,不失异构容器。

原文地址:https://www.cnblogs.com/qingshuiqingqing/p/8721184.html

时间: 2024-08-30 16:38:45

Thrift协议的相关文章

duboo服务使用thrift协议 + MQ

写一篇博客来记录从 Python 转型到 Java 的学习成果.整体架构: rpc: dubbo + thrift idl: thrift registeration: zookeeper MQ: kafka sql: mysql noSql: redis过程中遇到的问题: 1. 数据库唯一标示ID 沿用了 sonwflake 的设计方案, 单个服务每毫秒最大吞吐量为 4096 个ID2. 日志部分 目标: 每次请求只有一条info日志, 并且其他日志格式保持统一.(如 warn error)

Thrift的TJsonProtocol协议分析

Thrift协议实现目前有二进制协议(TBinaryProtocol),紧凑型二进制协议(TCompactProtocol)和Json协议(TJsonProtocol). 前面的两篇文字从编码和协议原理方面分析了TBinaryProtocol和TCompactProtocol协议,下面对TJsonProtocol协议做一下分析. TJsonProtocol协议相对比较简单,在网络中以文本方式传输,易于抓包分析和理解. 1. 数据类型表示方式和简写 数据类型 数据类型 Json协议节点简写 C++

dubbo/dubbox 增加原生thrift及avro支持

(facebook) thrift / (hadoop) avro / (google) probuf(grpc)是近几年来比较抢眼的高效序列化/rpc框架,dubbo框架虽然有thrift的支持,但是依赖的版本较早,只支持0.8.0,而且还对协议做一些扩展,并非原生的thrift协议. github上虽然也有朋友对dubbo做了扩展支持原生thrift,但是代码实在太多了,只需要一个类即可: Thrift2Protocal.java: package com.alibaba.dubbo.rpc

Dubbo各种协议

协议参考手册 (+) (#) 推荐使用Dubbo协议 性能测试报告各协议的性能情况,请参见:性能测试报告 (+) dubbo:// (+) (#) Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况. Dubbo缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低. [html] view plain copy <dubbo:protocol name="dubbo" port=&q

Hadoop Hive与Hbase整合+thrift

1.  简介 Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供完整的sql查询功能,可以将sql语句转换为MapReduce任务进行运行. 其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析. Hive与HBase的整合功能的实现是利用两者本身对外的API接口互相进行通信,相互通信主要是依靠hive_hbase-handler.jar工具类, 大致意思如图所示

Thrift源码分析(六)-- Transport传输层分析

RPC作为一种特殊的网络编程,会封装一层传输层来支持底层的网络通信.Thrift使用了Transport来封装传输层,但Transport不仅仅是底层网络传输,它还是上层流的封装. 关于Transport的设计,从架构上看,IO流和网络流都是IO的范畴,用一个统一的接口来抽象并无不可,但是个人感觉看Thrift的代码时,都用的Transport来表示流,不知道是普通IO流还是底层的网络流.还不如用Java的方式,把普通IO和网络接口用不同抽象隔离,至少代码逻辑比较清晰 废话不多说,看看Trasp

【转】dubbo各种协议

原文地址:http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-协议参考手册 协议参考手册 (+) (#) 推荐使用Dubbo协议 性能测试报告各协议的性能情况,请参见:性能测试报告 (+) dubbo:// (+) (#) Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况. Dubbo缺省协议不适合传送大数据量的服务,比如传文件,传视频等,除非请求量很低. [html] v

C++ Thrift Client 与 Flume Thrift Source 对接

项目需要C++代码与flume对接,进而将日志写入HDFS.flume原生为java代码,原先的解决方案是通过JNI调用flume java方法.但是由于一来对jni的调用效率的担心,二来C++调用JNI需要照顾local reference和GC的问题,被搞得头痛了.一怒之下,重写代码了,使用C++与远端的JAVA Flume对接. 在协议的选择上,AVRO C++虽然也有apache的开源项目,但是目前只支持读写文件,而不能使用RPC.故使用了thrift与远端Flume thrift so

dubbo支持协议及具体对比

对dubbo的协议的学习,可以知道目前主流RPC通信大概是什么情况,本文参考dubbo官方文档 http://dubbo.io/User+Guide-zh.htm dubbo共支持如下几种通信协议: dubbo:// rmi:// hessian:// http:// webservice:// thrift:// memcached:// redis:// 部分协议的特点和使用场景如下: 1.dubbo协议 Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及