thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发,它结合了功能强大的软件堆栈和代码生成引擎,以构建在C++、Java、Python、PHP、Ruby、Erlang、Perl、Haskell、C#、Cocoa、JavaScript、Node.js、Smalltalk、and OCaml这些编程语言的无缝结合的、搞笑的服务。

1、架构

thrift框架和微服务 thrift架构_数据传输

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

2、支持的数据传输格式、数据传输方式和服务模型

(1)支持的传输格式

           TBinaryProtocol-二进制格式

            TCompactProtocol-压缩格式

            TJSONProtocol-JSON格式

            TSimpleJSONProtocol-提供JSON只写协议,携程的文件很容易通过脚本语言解析

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

(2)支持的数据传输格式

            TSocket-阻塞式socket

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

            TFileTransport-以文件形式进行传输

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

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

(3)支持的服务模型

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

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

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

3、thrift中的类型

thrift类型系统包括预定义基本类型,用户自定义结构体,容器类型,异常和服务定义

(1)基本类型

        bool:布尔类型(true or false),占一个字节

        byte:有符号字节

        i16:16位有符号整数

        i32:32位有符号整数

        i64:64位有符号整数

        double:64位浮点数

        string:未知编码或者二进制的字符串

注意,thrift不支持无符号整型,因为很多目标语言不存在无符号整型(如java).

(2)容器类型

        thrift容器与类型密切相关,它与当前流行编程语言提供的容器类型相对应,采用Java泛型风格表示的。thrift提供了三种容器类型:

        List<t1>:一系列t1类型的元素组成的有序表,元素可以重复

        Set<t1>:一系列t1类型的元素组成的无序表,元素唯一

        Map<t1,t2>:key/value对(key的类型是t1且key唯一,value类型是t2)。

容器中的元素类型可以是除了service以外的任何合法的thrift类型(包括结构体和异常)。

(3)结构体和异常

    thrift结构体在概念上同C语言结构体类型——一种相关属性聚集(封装)在一起的方式。在面向对象的语言中,thrift结构体被转换成类。

    异常在语法和功能上类似于结构体,只不过异常使用关键字exception而不是struct关键字声明。但它在语义上不同于结构体——当定义一个RPC服务时,开发者可能需要声明一个远程方法抛出一个异常。

(4)服务

    服务的定义方法在语法上等同于面向对象语言中定义接口。thrift编译器会产生实现这些接口的client和server桩。

(5)类型定义

        thrift支持C/C++风格的typedef

            typedef i32 MyInteger   \\a

            typedef Tweer ReTweet    \\b

说明:

            a:末尾没有逗号

            b:struct可以使用typedef