参考资料:
[1] Thrift 入门
[2] Thrift入门及Java实例演示
[3] Thrift使用指南及语法介绍
[4] Thrift RPC 系列教程(1)——Thrift语言
[5] Java使用Thrift,Thrift结构体定义
[6] Thrift: The Missing Guide
[7] thrift IDL 基本类型和实践(一)struct 结构体、文件引用 和 基本类型
[8] Thrift IDL 语法定义
[9] What is the purpose of Thrift parameter numbering?
[10] Thrift之IDL


Base Types(基本类型)

  • bool:布尔值,true 或 false,对应 Java 的 boolean
  • byte:8 位有符号整数,对应 Java 的 byte
  • i16:16 位有符号整数,对应 Java 的 short
  • i32:32 位有符号整数,对应 Java 的 int
  • i64:64 位有符号整数,对应 Java 的 long
  • double:64 位浮点数,对应 Java 的 double
  • string:utf-8编码的字符串,对应 Java 的 String

tips:thrift 并不支持无符号整形,因为在很多 thrift 支持生成的目标语言中都无法将无符号类型直接转换成该语言的原生类型。

Special Types(特殊类型)

  • binary: 未经过编码的字节流

tips:为了与 java 有更好的互通,未来可能将其提升为基本类型

Containers(容器)

thrift 容器类型是强类型,可以映射至大部分编程语言对应的类型

  • list< t1>:对应 Java 的 ArrayList
  • set< t1>:对应 Java 的 HashSet
  • map< t1, t2>:对应 Java 的 HashMap

tips:
容器里可用任意 thrift 有效的数据类型,包括 structs 和 exceptions,除了 services;
map 的 key 只能是一个基本类型,不能是 structs 或 containers。

常量及类型别名(Const&&Typedef)

//常量定义
const i32 MALE_INT = 1
const map<i32, string> GENDER_MAP = {1: "male", 2: "female"}
//某些数据类型比较长可以用别名简化
typedef map<i32, string> gmp

Structs(结构体)

和 C 语言结构体差不多,在 Java 中是一个 JavaBean。

struct PersonInfo {1: required i32 id;2: required string name,3: optional string gender;6: optional string contry = "china"
}

tips:
1、struct 不能继承,但是可以嵌套,不能嵌套自己;
2、成员都通过正整数编号,编号不能重复,可以跳顺序;
3、成员分割符可以是逗号「,」或是分号「;」,而且可以混用,但是为了清晰期间,建议在定义中只使用一种;
4、每个字段可以设置默认值;
5、规范的 struct 定义中的每个域均会使用 required 或者 optional 关键字进行标识。如果 required 标识的域没有该字段,Thrift 将给予提示;如果 optional 标识的域没有赋值,该域将不会被序列化传输;如果某个 optional 标识域有缺省值而用户没有重新赋值,则该域的值一直为缺省值;如果某个 optional 标识域有缺省值或者用户已经重新赋值,而不设置它的 __isset 为 true,也不会被序列化传输。

union(联合)

当一个结构体中,field 之间的关系是互斥的,即只能有一个field被使用被赋值,可以用union 来声明这个结构体,而不是一堆 optional 的 field。

union JavaObjectArg {1: i32 int_arg;2: i64 long_arg;3: string string_arg;4: bool bool_arg;5: binary binary_arg;6: double double_arg;
}

enum(枚举)

//变量默认赋值从0开始;
enum GenderEnum{UNKNOWN,//0MALE,//1FEMALE//2
}
//后面的变量一次递增;
enum RoleEnum{UNKNOWN,  // -1WARIOR = 0,MAGE,// 1WARLOCK,// 2PRIEST,// 3DRUID// 4
}

tips:
变量只能赋值整数,可以为负数,也可以使用 16 进制整数赋值;
变量默认从 0 开始赋值;
变量分隔符可使用「,」和「;」,可以混用也可均不用,建议统一。
不支持嵌套

Exceptions(异常)

可以自定义异常类型,结构上等同于结构体,所定义的异常会继承对应语言的异常基类,例如java,就会继承 java.lang.Exception。

exception PlayerNotFoundException {1: i32 code = 400,2: string msg
}

Services(服务)

thrift定义服务相当于Java中创建Interface一样,创建的service经过代码生成命令之后就会生成客户端和服务端的框架代码。

service Twitter {response func1(1:Request1 request) throws (1:Exception1 exception),void func2(),                                                            bool func3(1:Request2 request) throws (1:Exception2 exception)
}

tips:
命名函数具有参数列表和返回值类型,参数可为空,没有返回值使用void关键字修饰;
参数类似 struct 中的成员字段定义,每个参数前都需要正整数和冒号编号,编号可以不连续;
参数列表可以使用分隔符「,」和「;」,可以混用也可均不用;
支持继承,不支持多态,不支持重载

Comment(注释)

Thrift支持C多行风格和Java/C++单行风格。

/** This is a multi-line comment.* Just like in C.*/
// C++/Java style single-line comments work just as well.

Namespace(命名空间)

类似 C++ 中的 namespace 和 Java 中的 package,它们提供了一种组织(隔离)代码的简便方式。名字空间也可以用于解决类型定义中的名字冲突。

namespace cpp com.example.test
namespace java com.example.test
namespace php com.example.test

tips:
可以针对不同语言分别定义命名空间

include

类似于 import

include "xxx.thrift"   // include 整个文件
include "xxx.xxx"  // 单纯 include 某个变量

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

thrift IDL相关推荐

  1. Thrift IDL基本语法

    简言:介绍Thrift的IDL基本语法,初次使用或多或少的会有很有"坑"要踩,但是我们要遇山挖山,遇海填海,在学习的道路上坚定的走下去,方可日后吹牛B! IDL Thrift 采用 ...

  2. Thrift IDL示例文件

    Java 示例1: 在src下新建thrift目录,在此目录下新建MyData.thrift文件 namespace java thrift.generatedtypedef i16 short ty ...

  3. [zz]Apache Thrift学习小记

    参考: http://incubator.apache.org/thrift/ http://wiki.apache.org/thrift/FrontPage http://jnb.ociweb.co ...

  4. 序列化--反序列化:Schema evolution in Avro, Protocol Buffers and Thrift

    当想要数据, 比如对象或其他类型的, 存到文件或是通过网络传输, 需要面对的问题是序列化问题 对于序列化, 当然各个语言都提供相应的包, 比如, Java serialization, Ruby's ...

  5. java服务端开发 php_PHP使用thrift做服务端开发

    php中文网最新课程 每日17点准时技术干货分享 php使用thrift做服务端开发 thrift采用接口描述语言定义和创建服务,用二进制格式传输数据,体积更小.效率更高,对于高并发.数据量大和多语言 ...

  6. 记一次内存溢出的分析经历——使用thrift

    背景: 有一个项目做一个系统,分客户端和服务端,客户端用c++写的,用来收集信息然后传给服务端(客户端的数量还是比较多的,正常的有几千个), 服务端用Java写的(带管理页面),属于RPC模式,中间的 ...

  7. python thrift demo

    简介 Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++, Java, Python, PHP, Ruby, Erlang, Perl, Has ...

  8. 如果某个字段值相同则触发器新增_Thrift IDL新增字段导致版本不一致引发的惨案...

    公司某业务出现严重的线上故障,复盘发现原因竟是某接口的 Thrift IDL 变更,未及时同步所有上游,导致上游某服务 OOM 引发 Crash.看似操作不规范是本次故障的根因,但进一步思考:该接口非 ...

  9. Thrift介绍以及Java中使用Thrift实现RPC示例

    场景 Thrift Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++, Java, Python,PHP, Ruby, Erlang,Perl ...

最新文章

  1. Mysql 安装服务无法启动解决方案与使用的一般使用指令
  2. 解决git无法clone地址为https的库
  3. 关于ESP8266 GPIO中断使用的总结
  4. anaconda如何更改环境配置_Anaconda环境配置2020-08-27
  5. Guice使用入门以及整合Redis
  6. 利用win7的applocker功能来有组织的阻止相关软件运行
  7. 导出oracle awr分析报告,配置oracle内存参数,察看表空间使用率
  8. python对找到的匹配项作处理后再替换回去
  9. 探讨如何确保对日软件外包开发过程中的质量
  10. python寻路_【Python】 Numpy极简寻路
  11. redis学习-当下NoSQL应用场景简介
  12. LeetCode 583 两个字符串的删除操作
  13. 十大硬盘数据恢复软件
  14. python相关性系数显著性检验_Python气象数据处理与绘图(4):显著性检验
  15. springboot获取客户端IP及IP归属地
  16. 【SQL SERVER 2005+版本行转列示例】(2012年1-8月水源槑党25强榜单新鲜出炉)
  17. ANT 下载,ant的配法 整理
  18. 大数据人才如此稀缺,学什么专业才能从事大数据?
  19. 强化学习笔记-01强化学习介绍
  20. windows的Alt键一直处于按下状态,解决,亲测有用

热门文章

  1. linux中w命令使用
  2. 【智慧农业】如何建造智能温室大棚
  3. web前端:文本、字体、图像、列表 全【含精灵图,box-sizing,字符间距,首行缩进,垂直对齐】
  4. 常见城市城市名称中英文json
  5. PullScrollView详解(六)——延伸拓展(listview中getScrollY()一直等于0、ScrollView中的overScrollBy)
  6. 我所知道坦克大战(单机版)之画出炮筒、让坦克发射多发炮弹、让炮弹消亡...
  7. linux mv工作原理,linux 中mv命令
  8. 今天除夕夜了 祝大家新年快乐 恭喜发财
  9. 未来从事计算机职业规划,计算机专业职业生涯规划书2000字
  10. masm5.0汇编+dosbox软件 搭建汇编环境