1、Types

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

(1) 基本类型

bool: 布尔类型,占一个字节

byte: 有符号字节

i16:16位有符号整型

i32:32位有符号整型

i64:64位有符号整型

double:64位浮点数

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

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

(2)容器类型

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

Set<t1>:一些t1类型的元素组成的无序集合,元素唯一不重复

Map<t1,t2>:key/value对,key唯一

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

(3)结构体和异常

Thrift结构体在概念上同c语言的结构体类似,在面向对象语言中,thrift结构体将被转化为类。

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

(4)服务

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

(5)类型定义

Thrift支持C/C++风格的typedef:

typedef i32 MyInteger   \\a
typedef Tweet ReTweet \\b

说明:

a.  末尾没有逗号

b.   struct可以使用typedef

2、枚举类型

可以像C/C++那样定义枚举类型,如:

enum TweetType {

TWEET,       //a

RETWEET = 2, //b

DM = 0xa,  //c

REPLY

}        //d

struct Tweet {

1: required i32 userId;

2: required string userName;

3: required string text;

4: optional Location loc;

5: optional TweetType tweetType = TweetType.TWEET // e

16: optional string language = "english"

}

说明:

a:编译器默认从0开始赋值

b:可以赋予某个常量

c:允许常量是十六进制整数

d:末尾没有逗号

e:给常量赋缺省值时,使用常量的全称

不同于protocol buffer,thrift不支持枚举类嵌套,枚举常量必须是32位正整数

3、注释

Thrift支持shell注释风格、C/C++语言中的单行或多行注释风格

# This is a valid comment.

/*

* This is a multi-line comment.

* Just like in C.

*/

// C++/Java style single-line comments work just as well.
 

4、命名空间

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

namespace cpp com.example.project  // a
namespace java com.example.project // b

5、文件包含

Thrift允许文件包含,需要使用thrift文件名作为前缀访问被包含的对象,如:

include "tweet.thrift"           // a

...

struct TweetSearchResult {

1: list<tweet.Tweet> tweets; // b

}

说明:

a:thrift文件名需要双引号包含,末尾没有逗号或者分号

b:注意tweet前缀

6、常量

Thrift允许用户定义常量,复杂的类型和结构体可以使用JSON形式表示:

const i32 INT_CONST = 1234;    // a

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

说明:

a:分号是可选的,支持十六进制赋值

7、定义结构体

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不同,结构体不支持继承,即,一个结构体不能继承另一个结构体。

8、定义服务

在流行的序列化/反序列化框架(如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。

Thrift语法参考的更多相关文章

  1. [SQL]SQL语言入门级教材_SQL语法参考手册(三)

    SQL 语法参考手册 DB2 提供了关连式资料库的查询语言 SQL (Structured Query Language),是一种非常口语化.既易学又易懂的语法. 此语言几乎是每个资料库系统都必须提供 ...

  2. [MSDN]关键字查询语言 (KQL) 语法参考

    MSDN:http://msdn.microsoft.com/library/ee558911(v=office.15) 了解如何构造 SharePoint 2013 中的搜索功能 的 KQL 查询. ...

  3. 《VTL语法参考指南》中文版[转]

    转自:http://blog.csdn.net/javafound/archive/2007/05/14/1607935.aspx <VTL语法参考指南>中文版 源文见 http://ve ...

  4. Podfile语法参考

    中文翻译可以参考:Podfile语法参考(译) 英文官方文档:Podfile Syntax Reference

  5. Destoon 模板存放规则 及 语法参考

    模板存放规则及语法参考 一.模板存放及调用规则 模板存放于系统 template 目录,template 目录下的一个目录例如 template/default/ 即为一套模板 模板文件以 .htm ...

  6. Asp.net MVC razor语法参考

    Razor语法的快捷参考http://haacked.com/archive/2011/01/06/razor-syntax-quick-reference.aspx/ 只是copy下来便于查阅! I ...

  7. Podfile语法参考(译)

    https://www.jianshu.com/p/8af475c4f717 2015.10.30 19:14* 字数 2496 阅读 35976评论 9喜欢 120 本文翻译自官方的Podfile ...

  8. Cmd Markdown语法参考

    https://www.zybuluo.com/mdeditor markdown语法说明 Markdown中公式的写法 $$P(X=k)=C_n^kp^k(1-p)^{n-k}$$ 欢迎使用 Cmd ...

  9. JIRA中的标记语言的语法参考

    前言 看到网上有的文章说JIRA是使用Textile这门标记语言,有些语法和Wikitext和Markdown相像.JIRA在2017年进行了一次大更新,某些语法可能和以前不大一样,这里纪录一下常用的 ...

随机推荐

  1. 一图看懂Kafka On Zookeeper

    Kafka On Zookeeper,点击看大图

  2. 使用VS2015 编译 64位的boost库

    别人写的编译参考: 目标:使用VS2015 编译 64位的boost库. 一直以来都是在Win32环境下Build和使用boost,但现在基本上每天都在64位Win7下工作,所以很有必要把这几天的经验 ...

  3. 一道hive面试题(窗口函数)

    表student中的数据格式如下: name month degree s1 201801 As1 201802 As1 201803 Cs1 201804 As1 201805 As1 201806 ...

  4. 20170607 JDBC课堂实践 任务四

    20170607 JDBC课堂实践 任务四 题目 查询world数据库,查询哪个国家的平均寿命最长. 码云链接 SQL语句 SELECT Code, Name, LifeExpectancy FROM ...

  5. 服务端调用接口API利器之HttpClient

    前言 之前有介绍过HttpClient作为爬虫的简单使用,那么今天在简单的介绍一下它的另一个用途:在服务端调用接口API进行交互.之所以整理这个呢,是因为前几天在测试云之家待办消息接口的时候,有使用云 ...

  6. CF 96 D. Volleyball

    D. Volleyball http://codeforces.com/contest/96/problem/D 题意: n个路口,m条双向路,每条长度为w.每个路口有一个出租车司机,最多可以乘坐这辆 ...

  7. springboot+security+JWT实现单点登录

    本次整合实现的目标:1.SSO单点登录2.基于角色和spring security注解的权限控制. 整合过程如下: 1.使用maven构建项目,加入先关依赖,pom.xml如下: <?xml v ...

  8. Web自动化常用方法封装(不定时更新)

    /** * JScript实现鼠标悬停 */public void mouseHoverJScript(By by,WebElement HoverElement) { // TODO Auto-ge ...

  9. 05-Docker架构详解

    Docker 的核心组件包括: Docker 客户端 - Client Docker 服务器 - Docker daemon Docker 镜像 - Image Registry Docker 容器 ...

  10. TW实习日记:第八天

    今天早上主要是接着做昨天的微信端网页预览附件,听同事说当打包代码放入服务器上后,就不存在跨域问题了,也就懒得自己写接口了,那么就希望自己能一次过吧...结果写着写着,发现开发文档中关于预览文件的方法, ...