常量
Thrift把所有的常量放在一个叫Constants的public类中,每个常量修饰符是public static final。
C++语言产生的文件
所有变量均存放在一个.cpp/.h文件对中
所有的类型定义(枚举或者结构体)存放到另一个.cpp/.h文件对中
每一个service有自己的.cpp/.h文件
$ tree gen-cpp|– example_constants.cpp|– example_constants.h|– example_types.cpp|– example_types.h|– Twitter.cpp|– Twitter.h`– Twitter_server.skeleton.cpp其他语言Python,Ruby,javascript等
实践经验thrift文件内容可能会随着时间变化的。如果已经存在的消息类型不再符合设计要求,比如,新的设计要在message格式中添加一个额外字段,但你仍想使用以前的thrift文件产生的处理代码。如果想要达到这个目的,只需:
- 不要修改已存在域的整数编号
- 新添加的域必须是optional的,以便格式兼容。对于一些语言,如果要为optional的字段赋值,需要特殊处理,比如对于C++语言,要为
struct Example{ i32 id, string name, optional age,}中的optional字段age赋值,需要将它的 __isset 值设为true,这样才能序列化并传输或者存储(不然optional字段被认为不存在,不会被传输或者存储),
如:
Example example;example.age=10,example.__isset.age = true; //__isset是每个thrift对象的自带的public成员,来指定optional字段是否启用并赋值。- 非required域可以删除,前提是它的整数编号不会被其他域使用。对于删除的字段,名字前面可添加 OBSOLETE_以防止其他字段使用它的整数编号。
- thrift文件应该是unix格式的(windows下的换行符与unix不同,可能会导致你的程序编译不过),如果是在window下编写的,可使用dos2unix转化为unix格式。
- 貌似当前的thrift版本(0.6.1)不支持常量表达式的定义(如 const i32 DAY = 24 * 60 * 60),这可能是考虑到不同语言,运算符不尽相同。
利用Thrift部署服务主要流程:
- 编写服务说明,保存到.thrift文件
- 根据需要, 编译.thrift文件,生成相应的语言源代码
- 根据实际需要, 编写client端和server端代码。
thrift文件编写一般将服务放到一个.thrift文件中,服务的编写语法与C语言语法基本一致,在.thrift文件中有主要有以下几个内容:
- 变量声明
- 数据声明(struct)
- 服务接口声明(service, 可以继承其他接口)。
下面分析Thrift的tutorial中带的例子tutorial.thrift
- 包含头文件:59行:include “shared.thrift”
- 指定目标语言:65行:namespace cpp tutorial
- 定义变量:80行:const i32 INT32CONSTANT = 9853
- 定义结构体:103行:
struct Work { i32 num1 = 0, i32 num2, Operation op, optional string comment,}定义服务:
service Calculator extends shared.SharedService {void ping(), i32 add(1:i32 num1, 2:i32 num2), i32 calculate(1:i32 logid, 2:Work w) throws (1:InvalidOperation ouch), oneway void zip()}- 要生成C++代码:./thrift –gen cpp tutorial.thrift,结果代码存放在gen-cpp目录下
- 要生成java代码:./thrift –gen java tutorial.thrift,结果代码存放在gen-java目录下
|