首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Thrift架构介绍(6)

Thrift架构介绍(6)

常量
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目录下
返回列表