thrift

基本类型

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

byte:有符号字节java

i16:16位有符号整型c++

i32:32位有符号整型服务器

i64:64位有符号整型网络

double :64位浮点数多线程

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

注意,thrift不支持无符号整型,由于不少目标语言不存在无符号整型(如java)。post

支持的传输协议

    * TBinaryProtocol : 二进制编码格式进行数据传输。
    * TCompactProtocol : 这种协议很是有效的,使用Variable-Length Quantity (VLQ) 编码对数据进行压缩。
    * TJSONProtocol使用JSON的数据编码协议进行数据传输。
    * TSimpleJSONProtocol这种节约只提供JSON只写的协议,适用于经过脚本语言解析
    * TDebugProtocol  :  在开发的过程当中帮助开发人员调试用的,以文本的形式展示方便阅读。学习

传输层

    * TSocket使用堵塞式I/O进行传输,也是最多见的模式。
    * TFramedTransport使用非阻塞方式,按块的大小,进行传输,相似于Java中的NIO
    * TFileTransport 顾名思义按照文件的方式进程传输,虽然这种方式不提供Java的实现,可是实现起来很是简单。
    * TMemoryTransport :  使用内存I/O,就比如Java中的ByteArrayOutputStream实现。
    * TZlibTransport 使用执行zlib压缩,不提供Java的实现。ui

服务端类型

    * TSimpleServer : 单线程服务器端使用标准的堵塞式I/O
    * TThreadPoolServer : 
多线程服务器端使用标准的堵塞式I/O
    * TNonblockingServer :
 多线程服务器端使用非堵塞式I/O,而且实现了Java中的NIO通道

 TransportTransport层提供了一个简单的网络读写抽象层。这使得thrift底层的transport从系统其它部分(如:序列化/反序列化)解耦。

 

        规范的struct定义中的每一个域均会使用required或者optional关键字进行标识。若是required标识的域没有赋值,Thrift将给予提示;若是optional标识的域没有赋值,该域将不会被序列化传输;若是某个optional标识域有缺省值而用户没有从新赋值,则该域的值一直为缺省值;若是某个optional标识域有缺省值或者用户已经从新赋值,而不设置它的__isset为true,也不会被序列化传输

 

Enum

不一样于protocal buffer,thrift不支持枚举类嵌套,枚举常量必须是32位的正整数

  • 编译器默认从0开始赋值
  • 能够赋予某个常量某个整数
  • 容许常量是十六进制整数
  • 末尾没有分号
  • 给常量赋缺省值时,使用常量的全称
    enum EnOpType {
    CMD_OK = 0, // (0)   
    CMD_NOT_EXIT = 2000, // (2000)
    CMD_EXIT = 2001, // (2001)    
    CMD_ADD = 2002 // (2002)
    }
    
    struct StUser {
    1: required i32 userId;
    2: required string userName;
    3: optional EnOpType cmd_code = EnOpType.CMD_OK; // (0)
    4: optional string language = “english”
    }

     

Includes

便于管理、重用和提升模块性/组织性,经常分割Thrift定义在不一样的文件中。包含文件搜索方式与c++同样。Thrift容许文件包含其它thrift文件,用户须要使用thrift文件名做为前缀访问被包含的对象

include "test.thrift"   
...
struct StSearchResult {
    1: in32 uid; 
    ...
}

Namespace

Thrift中的命名空间相似于C++中的namespace和java中的package,它们提供了一种组织(隔离)代码的简便方式。名字空间也能够用于解决类型定义中的名字冲突。

namespace cpp com.example.test
namespace java com.example.test 
namespace php com.example.test

Services

服务的定义方法在语义(semantically)上等同于面向对象语言中的接口。Thrift编译器会产生执行这些接口的client和server stub。具体参见下一节。在流行的序列化/反序列化框架(如protocal buffer)中,Thrift是少有的提供多语言间RPC服务的框架。这是Thrift的一大特点。

service SeTest {
      void ping(),
      bool postTweet(1: StUser user);
      StUser searchTweets(1:string name);
     oneway void zip()

}

Exception

Thrift结构体将会被转换成面向对象语言的类。异常在语法和功能上相似于结构体,差异是异常使用关键字exception,并且异常是继承每种语言的基础异常类。

exception Extest {
1: i32 errorCode,
2: string message,
3: StUser userinfo
}

struct

struct是定义为一种对象,和面向对象语言的class差很少.,可是struct有如下一些约束:

  • struct不能继承,可是能够嵌套,不能嵌套本身。
  • 其成员都是有明确类型
  • 成员是被正整数编号过的,其中的编号使不能重复的,这个是为了在传输过程当中编码使用。
  • 成员分割符能够是逗号(,)或是分号(;),并且能够混用,可是为了清晰期间,建议在定义中只使用一种,好比C++学习者能够就使用分号(;)。
  • 字段会有optional和required之分和protobuf同样,可是若是不指定则为无类型—能够不填充该值,可是在序列化传输的时候也会序列化进去,optional是不填充则部序列化,required是必须填充也必须序列化。
  • 每一个字段能够设置默认值
  • 同一文件能够定义多个struct,也能够定义在不一样的文件,进行include引入
struct Report
{
  1: required string msg, //改字段必须填写
  2: optional i32 type = 0; //默认值
  3: i32 time //默认字段类型为optional
}
相关文章
相关标签/搜索