.thrift文件

1,036 阅读4分钟

参考网址

www.cnblogs.com/pdca/p/4454… blog.csdn.net/weixin_3996…

1/什么是.thrift文件

简单来说,.thrift文件是一个服务的说明书

2/数据类型

<1>基本类型

-   bool:布尔值,truefalse,对应 Java 的 boolean
-   byte8 位有符号整数,对应 Java 的 byte
-   i16:16 位有符号整数,对应 Java 的 short
-   i32:32 位有符号整数,对应 Java 的 int
-   i64:64 位有符号整数,对应 Java 的 long
-   double64 位浮点数,对应 Java 的 double
-   string:utf-8编码的字符串,对应 Java 的 String
-   注意,thrift不支持无符号整型,因为很多目标语言不存在无符号整型(如java)。

<2>结构体类型:

-   struct:定义公共的对象,类似于 C 语言中的结构体定义,在 Java 中是一个 JavaBean

<3>容器类型:

-   list:对应 Java 的 ArrayList
-   set: 对应 Java 的 HashSet
-   map: 对应 Java 的 HashMap

<4>异常类型:

-   exception:对应 Java 的 Exception

<5>服务类型:

-   service:对应服务的类

3/命令空间

Thrift中的命名空间和C++中的namespace以及java中的package类似,它们均提供了一种组织(隔离)代码的方式。
因为每种开发语言均有自己的命名空间定义方式(如python中有module),thrift允许开发者针对特定语言定义namespace,如下示例:
namespace java com.example.project 
说明:转换成package com.example.project

4/文件包含

Thrift允许thrift文件包含,用户需要使用thrift文件名作为前缀访问被包含的对象,如:\
include "tweet.thrift"  \
...\
struct TweetSearchResult {\
1: list<tweet.Tweet> tweets; // b\
}

说明:\
a.  thrift文件名要用双引号包含,末尾没有逗号或者分号\
b.  注意tweet前缀

5/常量

Thrift允许用户定义常量,复杂的类型和结构体可使用JSON形式表示。
const i32 INT_CONST = 1234;   //定义了一个i32类型的常量,名字是INT_CONST,值是1234
const map<string,string> MAP_CONST = {"hello": "world", "goodnight": "moon"}
// 定义了一个map类型的常量,名字是MAP_CONST,值是{"hello": "world", "goodnight": "moon"}

说明: 分号是可选的,可有可无;支持十六进制赋值。

6/定义结构体struct

结构体是基本的复杂数据结构.
它们由每个具有整数标识符,类型,符号名称和可选缺省值的字段组成
字段可以被声明为"optional", 这确保了如果它们未被设置的话,

结构体由一系列域组成(每一行是一个域),每个域有唯一整数标识符,类型,名字和可选的缺省参数组成。
如下面有2个结构体,每个结构体中有一个或者多个域。
struct Tweet {
1: required i32 userId;                  // a
2: required string userName;             // b
3: required string text;
4: optional Location loc;                // c
16: optional string language = "english" // d
}

struct Location {                            // e
1: required double latitude;
2: required double longitude;
}

说明:

a.  每个域有一个唯一的,正整数标识符
b.  每个域可以标识为required或者optional(也可以不注明)
c.  结构体可以包含其他结构体
d.  域可以有缺省值
e.  一个thrift中可定义多个结构体,并存在引用关系

规范的struct定义中的每个域均会使用required或者optional关键字进行标识。
如果required标识的域没有赋值,thrift将给予提示。
如果optional标识的域没有赋值,该域将不会被序列化传输。
如果某个optional标识域有缺省值而用户没有重新赋值,则该域的值一直为缺省值。
与service不同,结构体不支持继承,即,一个结构体不能继承另一个结构体。

7/定义服务

service只需要一个名称,并可以选择使用extend关键字从另一个服务继承
在流行的序列化/反序列化框架(如protocol buffer)中,thrift是少有的提供多语言间RPC服务的框架。
Thrift编译器会根据选择的目标语言为server产生服务接口代码,为client产生桩代码。
//“Twitter”与“{”之间需要有空格!!!

service Twitter {
// 方法定义方式类似于C语言中的方式,它有一个返回值,一系列参数和可选的异常列表.
// 注意,参数列表和异常列表定义方式与结构体中域定义方式一致.
void ping(),                                    // a
bool postTweet(1:Tweet tweet);                  // b
TweetSearchResult searchTweets(1:string query); // c
// ”oneway”标识符表示client发出请求后不必等待回复(非阻塞)直接进行下面的操作, ”oneway”方法的返回值必须是void
oneway void zip()                               // d
}
说明:
a. 函数定义可以使用逗号或者分号标识结束
b. 参数可以是基本类型或者结构体,参数是只读的(const),不可以作为返回值!!!
c. 返回值可以是基本类型或者结构体
d. 返回值可以是void
注意,函数中参数列表的定义方式与struct完全一样
Service支持继承,一个service可使用extends关键字继承另一个service