thrift接口描述语言 (基于thrift 0.13.0版本)
thrift接口描述语言(IDL)用来定义thrift类型. 一个Thrift IDL文件用来生成各种语言使用的结构体和服务.
IDL中包含如下部分:
1. Document
Document中包含0或者多条如下的声明:
(1) include Literal
Thrift Include: 用来导入其他thrift中的符号, 在这个thrift中使用导入的thrift中的符号时, 需要带一个前缀.这个thrift编译时, 被导入thrift的对应头文件会被插入到这个thrift编译的相应文件中.
说明: Literal表示字符串常量, 写法要求有可选值(其中*表示0或者多个字符):
1) “[^”]*” (其中[^”]表示不为双引号的字符)
2) ‘[^’]*’ (其中[^’]表示不为单引号的字符)
示例: include "xxx.thrift"
(2) cpp_include Literal
C++ Include: 用来在这个thrift编译生成的文件中添加Literal头文件.
示例: cpp_include "xxx.h"
(3) namespace NamespaceScope Identifier
Namespace: 一个namespace表示一个命名空间/包/模块等, 含义基于编译成的目标语言, 其中在C++中表示命名空间名, 在golang中表示包名. NamespaceScope表示对应的编程语言, 如果使用*, 则表示对所有的语言都使用同样的Namespace名.
说明:
(1) NamespaceScope可以使用如下值取代: *, c_glib, cpp, csharp, delphi, go, java, js, lua, netcore, perl, php, py, py.twisted, rb, st, xsd.
(2) Identifier允许的写法(其中|表示或的关系, *表示出现0次或者多次): (Letter|_)(Letter | Digit | . | _ | -)*.
(3) Letter表示A-Z或者a-z中的一个字符.
(4) Digit表示0-9中的一个数字.
示例: namespace cpp tutorial
2. Definition
Definition包含如下的多条定义:
(1) const FieldType Identifier = ConstValue ListSeparator?
说明: ?表示可选, 其中ListSeparator包括两个可选值: (1) ,(逗号) (2);(分号)
用来定义一个常量, 可以参考如下示例:
const i32 INT32CONSTANT = 9853
const map<string,string> MAPCONSTANT = {'hello':'world', 'goodnight':'moon'}
(2) typedef DefinitionType Identifier
用来定义一个类型的别名, 其中DefinitionType包括可选值: (1) BaseType (2) ContainerType, BaseType和ContainerType的说明见后文, 关于定义别名, 可以参考如下示例:
typedef i32 MyInteger
(3) enum Identifier { (Identifier (= IntConstant)? ListSeparator?)* }
说明: 其中的*表示多条
用来定义一个枚举类型. 如果枚举结构体内的标识符没有提供常量, 那么第一个元素取0, 对于后续元素会比前一个元素大1. 所有提供的常量都必须是非负的. 可以参考如下示例:
enum Operation {
ADD = 1,
SUBTRACT = 2,
MULTIPLY = 3,
DIVIDE = 4
}
/**
* Common status reporting mechanism across all services
*/
enum fb_status {
DEAD = 0,
STARTING = 1,
ALIVE = 2,
STOPPING = 3,
STOPPED = 4,
WARNING = 5,
}
(4) senum Identifier { (Literal ListSeparator?)* }
注: 和slist都是deprecated, 都使用string来代替.
(5) struct Identifier { Field* }
用来定义复合类型, struct中的每个成员名都需要是唯一的, 可以参考如下示例:
struct Work {
1: i32 num1 = 0,
2: i32 num2,
3: Operation op,
4: optional string comment,
}
(6) union Identifier { Field* }
用来定义union类型, union类型中的所有成员只有一个成员有值, 当设置另一个成员时, 就只会有那个成员有值, 这个类型类似于C++中的union. 所以, union中的成员都默认为可选的(查看requiredness). 可以参考如下示例:
union Dessert {
1: string port
2: string iceWine
}
(7) exception Identifier { Field* }
用来定义一个异常. exception中的每一个成员都需要是唯一的.
/**
* Structs can also be exceptions, if they are nasty.
*/
exception InvalidOperation {
1: i32 whatOp,
2: string why
}
(8) service Identifier (extends Identifier)? { Function* }
用来定义使用thrift的服务器的函数接口. 一个服务可以扩展(extend)其他的服务, 那么这个服务就可以提供被扩展服务的函数接口. 关于服务的一个简单示例:
/**
* Standard base service
*/
service FacebookService { /**
* Returns a descriptive name of the service
*/
string getName(), /**
* Returns the version of the service
*/
string getVersion(), /**
* Gets the status of this service
*/
fb_status getStatus(), /**
* User friendly description of status, such as why the service is in
* the dead or warning state, or what is being started or stopped.
*/
string getStatusDetails(), /**
* Gets the counters for this service
*/
map<string, i64> getCounters(), /**
* Gets the value of a single counter
*/
i64 getCounter(1: string key), /**
* Sets an option
*/
void setOption(1: string key, 2: string value), /**
* Gets an option
*/
string getOption(1: string key), /**
* Gets all options
*/
map<string, string> getOptions(), /**
* Returns a CPU profile over the given time interval (client and server
* must agree on the profile format).
*/
string getCpuProfile(1: i32 profileDurationInSec), /**
* Returns the unix time that the server has been running since
*/
i64 aliveSince(), /**
* Tell the server to reload its configuration, reopen log files, etc
*/
oneway void reinitialize(), /**
* Suggest a shutdown to the server
*/
oneway void shutdown(), }
下面解释一下上面出现的Field和Function.
Field
Field的定义如下:
IntConstant : FieldReq? FieldType Identifier (= ConstValue)? ListSeparator?
其中FieldReq可选值包括: (1) required (2) optional (3) 如果没有指定, 则为default.
(1) required表示这个字段是必需的.
(2) optional 表示这个字段是可选的.
大多数语言使用推荐的”isset”标志来标示optional的成员有没有被设置值.
(3) default
default是optional和required的混合,因此内部名为”opt-in,req-out”. 虽然理论上这些字段都会被写入(“req-out”), 实际上未被设置的字段总是不会写入. 尤其是, 结构体中的某个字段根据定义包含不能通过thrift发送的值. 这种情况下,唯一能够采取的方式,就是根本不写入这个值.
关于默认值特定要注意的是, 任何没有显示写入的默认值, 会随着接口定义而改变, 而将默认值写入到output中, IDL改变默认值,不会对这个产生影响.
FieldType说明:
1. FieldType包括可选值: (1) Identifier (thrift中定义的struct, union等) (2) BaseType (3) ContainerType
2. BaseType包括可选值: bool, byte, i8, i16, i32, i64, double, string, binary, slist
3. ContainerType包括可选值:
(1) map (cpp_type Literal)? <FieldType, FieldType>
(2) set (cpp_type Literal)? <FieldType>
(3) list<FieldType> (cpp_type literal)?
ConstValue包括如下可选值(其中+号表示1个或者多个, |表示或的关系):
(1) IntConstant: (+ | -)? Digit+
(2) DoubleConstant: (+ | -)? Digit* (.Digit+)? ( (E | e) IntConstant)?
(3) ConstList: [ (ConstValue ListSeparator?)*]
(4) ConstMap: { (ConstValue : ConstValue ListSeparator?)* }
Function:
Function的定义格式: oneway? (FieldType | void) Identifier (Field*) (throws (Field*))? ListSeparator?
其中涉及的FieldType, Identifier, Field等的定义, 参考上面的说明.
thrift接口描述语言 (基于thrift 0.13.0版本)的更多相关文章
- NVIDIA DIGITS 学习笔记(NVIDIA DIGITS-2.0 + Ubuntu 14.04 + CUDA 7.0 + cuDNN 7.0 + Caffe 0.13.0)
转自:http://blog.csdn.net/enjoyyl/article/details/47397505?from=timeline&isappinstalled=0#10006-we ...
- dbt 0.13.0 新添加特性sources 试用
dbt 0.13 添加了一个新的功能sources 我呢可以用来做以下事情 从基础模型的源表中进行数据选择 测试对于源数据的假设 计算源数据的freshness source 操作 定义source ...
- Pig安装及简单使用(pig版本0.13.0,Hadoop版本2.5.0)
原文地址:http://www.linuxidc.com/Linux/2014-03/99055.htm 我们用MapReduce进行数据分析.当业务比较复杂的时候,使用MapReduce将会是一个很 ...
- CM12.1/13.0编译教程
环境搭建 1.安装64位Ubuntu系统(实体安装.虚拟机安装均可) 注意:要求机器至少4G内存(虚拟机至少分配4G内存),硬盘至少100G空间(源码20G+,编译后整个目录约60~70G) 安装方法 ...
- hive-0.12升级成hive 0.13.1
安装了0.12之后,听说0.13.1有许多新的特性,包括永久函数,所以想更新成0.13版的(元数据放在mysql中) 2014年8月5日实验成功 hive0.13.1的新特性 新特性详见 http:/ ...
- 【Android 系统开发】CyanogenMod 13.0 源码下载 编译 ROM 制作 ( 手机平台 : 小米4 | 编译平台 : Ubuntu 14.04 LTS 虚拟机)
分类: Android 系统开发(5) 作者同类文章X 版权声明:本文为博主原创文章 ...
- Oracle 11.2.0.4.0 Dataguard部署和日常维护(3)-Datauard监控篇
1. v$database 查看当前数据库的角色和保护模式 primary库查看 column NAME format a10 column PROTECTION_MODE format a2 ...
- 基于thrift的微服务框架
前一阵开源过一个基于spring-boot的rest微服务框架,今天再来一篇基于thrift的微服务加框,thrift是啥就不多了,大家自行百度或参考我之前介绍thrift的文章, thrift不仅支 ...
- 分享一个基于thrift的java-rpc框架
简单介绍 这是一个简单小巧的Java RPC框架,适用于Java平台内.为系统之间的交互提供了.高性能.低延迟的方案.适合在集群数量偏少的情况下使用(50台以下集群环境).当然.它也可以在大型集群环境 ...
随机推荐
- Sword CRC算法原理
CRC校验原理 CRC校验其根本思想a.发送端和接收端约定一个整数 bb.发送端在原始数据帧后面附加一个数 k ,产生一个新的数据帧c.接收端接收到数据帧后,对接收的数据帧和整数 b 进行位异或操作, ...
- ireport5.6.0分组显示
一,ireport中分组 二,java调用实现分组 一,ireport中分组: 1,新建模板文件,纸张随意,名称随意,路径随意 2,连接要分组的数据源 3,添加测试表和数据 CREATE TABLE ...
- exe文件图标不见了,教你win10桌面EXE文件图标不见了如何解决
1.进入cmd 2.输入以下命令 taskkill /im explorer.exe /f cd /d %userprofile%\appdata\local del iconcache.db /a ...
- JS核心系列:原型对象
在JS中,每当创建一个函数对象f1 时,该对象中都会内置一些属性,其中包括prototype和proto, prototype即原型对象. 每一个构造函数都有一个与之相关联的对象,该对象称之为原型对象 ...
- 聚焦JavaScript面向对象的思想
面向对象是一种软件开发方法,是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物.随着时代的发展,计算机被用于解决越来越复杂的问题.一切事物皆对象,通过面向对象的方式,将现实世界的 ...
- Java的集合类之 map 接口用法
Map接口不是Collection接口的继承.而是从自己的用于维护键-值关联的接口层次结构入手.按定义,该接口描述了从不重复的键到值的映射. 我们可以把这个接口方法分成三组操作:改变.查询和提供可选视 ...
- java + selenium + testng实现简单的UI自动化
新建Maven项目,添加需要的依赖 1.新建一个Maven项目 2.在pom.xml中添加需要的依赖,这里只要selenium和testng就行 <!-- https://mvnreposito ...
- 【LOJ523】[LibreOJ β Round #3]绯色 IOI(悬念)(霍尔定理_基环树)
题目 LOJ523 官方题解 分析 由于某些原因,以下用「左侧点」和「右侧点」分别代替题目中的「妹子」和「男生」. 根据题意,显然能得出一个左侧点只能向一个或两个右侧点连边.这似乎启发我们把左侧点不看 ...
- JDK8从永生代到元数据区
永生代 永生代默认的最大内存大小是在32位JVM上为64MB, 在64位JVM上为82MB.可以通过-XX:PermSize=[size]和-XX:MaxPermSize=[size]来调整. 永生代 ...
- 国际化地区语言码对照表(i18n)
af 公用荷兰语 af-ZA 公用荷兰语 - 南非 sq 阿尔巴尼亚 sq-AL 阿尔巴尼亚 -阿尔巴尼亚 ar 阿拉伯语 ar-DZ 阿拉伯语 -阿尔及利亚 ar-BH 阿拉伯语 -巴林 ar-EG ...