thrift IDL基本语法

thrift简介

Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型,然后通过一个编译器生成不同语言的代码(目前支持C++,Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk和OCaml),并由生成的代码负责RPC协议层和传输层的实现。

Thrift实际上是实现了C/S模式,通过代码生成工具将接口定义文件生成服务器端和客户端代码(可以为不同语言),从而实现服务端和客户端跨语言的支持。

thrift基本语法

基本类型

thrift不支持无符号类型,因为很多编程语言不存在无符号类型。

  • byte:有符号字节
  • i16:16位有符号整数
  • i32:32位有符号整数
  • i64:64位有符号整数
  • double:64位浮点数
  • string:字符串类型

容器类型

Thrift容器与类型密切相关,它与当前流行编程语言提供的容器类型相对应。容器中的元素可以是除了service之外的任何合法thrift类型(包括结构体和异常)。这里有三种可用容器类型。

list<t1>    //一系列t1类型的元素组成的有序表,元素可以重复
set<t1>     //一系列t1类型的元素组成的无序表,元素唯一
map<t1,t2>  //key/value对(key的类型是t1且key唯一,value类型是t2)。

结构体(struct)

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

struct People {
    1: string name;
    2: i32 age;
    3: string sex;
}

关于字段类型:

  • 规范的 struct 定义中的每个域均会使用 required 或者 optional 关键字进行标识,但是如果不指定则为无类型,可以不填充该值,但是在序列化传输的时候也会序列化进去。其中 optional 是不填充则不序列化,required 是必须填充也必须序列化。
  • Optional字段及无类型字段都具有__isset属性。Optional字段变量有默认值时,其__isset属性默认为true,否则为false。若optional字段变量的__isset属性为false,则不进行序列化。经测试修改无类型字段变量的__isset属性值对序列化没有影响,即总是会被序列化并有效传输。

异常(exception)

异常在语法和功能上类似于结构体,但它在语义上不同于结构体。当定义一个RPC服务时,开发者可能需要声明一个远程方法抛出一个异常。

exception RequestException {
    1: i32 code;
    2: string reason;
}

枚举(enum)

可以像C/C++中那样定义枚举类型。

enum Color{
    RED,
    BLUE = 6,
    PINK
}

注:

  • 编译器默认从0开始赋值
  • 可以赋予某个常量整数值

服务(Service)

服务的定义方法在语法上等同于面向对象语言中定义接口。Thrift编译器会产生实现这些接口的client和server桩。需要注意的是,这里函数参数是只读的(const),不可以作为返回值!!!

service HelloWordService {
     // service中定义的函数,相当于C++ 抽象类中定义的纯虚函数
     string doAction(1: string name, 2: i32 age);

    // ”oneway”标识符表示client发出请求后不必等待回复(非阻塞)直接进行下面的操作,
    // ”oneway”方法的返回值必须是void
    oneway void zip();  
}

类型定义

thrift支持类似C++一样的typedef 定义,注意末尾没有逗号或者分号。

typedef i32 Integer
typedef i64 Long

常量(const)

Thrift允许用户定义常量,复杂的类型和结构体可使用JSON形式表示。末尾的分号是可选的,可有可无。

const i32 INT_CONST = 1234; 
const map<string,string> MAP_CONST = {"hello": "world", "goodnight": "moon"}

命名空间(namespace)

Thrift中的命名空间同C++中的namespace和java中的package类似,它们均提供了一种组织(隔离)代码的方式。因为每种语言均有自己的命名空间定义方式(如python中有module),thrift允许开发者针对特定语言定义namespace

namespace cpp com.example.project       //作用于C++代码
namespace java com.example.project      //作用于java代码

文件包含

thrift支持文件包含,相当于C/C++中的include,使用关键字include定义。在.thrift文件中引用其他thrift文件中定义的变量需要使用文件名前缀。

include "tweet.thrift"

struct TweetSearchResult {
    1: list<tweet.Tweet> tweets; 
}

注释方式

thrift注释方式支持shell风格的注释,支持C/C++风格的注释,即#和//开头的语句都单当做注释,/**/包裹的语句也是注释。

生成代码

首先创建了一个thrift脚本,命名为login.thrift,内容如下

namespace cpp com. thrift  

struct Request {  
    1: string username;        
    2: string password;             
}  

exception RequestException {  
    1: required i32 code;  
    2: optional string reason;  
}  

// 服务名  
service LoginService {  
    string doAction(1: Request request) throws (1:RequestException qe); // 可能抛出异常。  
}

然后将该文件放置于thrift.exe同一目录下,在该目录下打开cmd命令窗口。输入如下指令

thrift -r -gen cpp login.thrift

接着便可以在gen-cpp文件夹下看到自动生成的框架代码。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页