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台以下集群环境).当然.它也可以在大型集群环境 ...
随机推荐
- lamda表达式求最小值
//取最小设置金额的列 var minList = LsList.OrderBy(n=>n.Price).First(); //取最小设置金额的值 var minValue = LsList.S ...
- Android 使用NDK编译二进制文件并运行
Android 使用NDK编译二进制文件并运行本文介绍如何编译可以在Android平台上运行的二进制可执行文件. 首先我们,知道,Android是基于Linux的,而在Linux上,可以执行二进制文件 ...
- Sword CRC算法原理
CRC校验原理 CRC校验其根本思想a.发送端和接收端约定一个整数 bb.发送端在原始数据帧后面附加一个数 k ,产生一个新的数据帧c.接收端接收到数据帧后,对接收的数据帧和整数 b 进行位异或操作, ...
- PHP Y2K38 (2038年) 问题
PHP 的 strtotime('2100-01-01'); 转换失败:经查询是因为32位系统的 Y2K38问题: Y2K38 问题:当时间大于 2038年01月19日03:14:07 时,strto ...
- vue + axios + formdata 上传文件带参数的爬坑之路
submitForm(event) { let formData = new FormData() formData.append('name', this.name) formData.append ...
- Laravel 登录后跳转回登录前浏览的页面
一.经过 Auth 中间件检查后跳转至登录页面 也就是没有通过 auth 中间件的认证检查,被 auth 中间件拦截后跳转至登录页面.这种情况下,Laravel 默认会在用户登录成功后自动跳转回登录前 ...
- Ubuntu tricks
linux 复制文件夹内所有文件到另一个文件夹 cp -Rf /home/user1/* /root/temp/ 将 /home/user1目录下的所有东西拷到/root/temp/下而不拷贝user ...
- SQL Server sp_monitor使用
SQL Server提供了sp_monitor存储过程可以方便我们查看SQL Server性能统计信息,包括CPU/Network/IO,通过这些信息可以对自己的数据库性能状况有一个大致的了解. 下面 ...
- 用Scratch制作一个Hello World程序
网上出现了很多Hello World程序,看的小编心里也痒痒的,为此这次作为南京小码王Scratch培训机构的小编,就为大家来详细的了解下Scratch制作Hello World程序的过程,现在就和小 ...
- PHP中YUM的理解
1. YUM是什么? 1)全称:Yellow dog Updater ,Modified. 2)百度简述:是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器.基于RPM包 ...