thrift由fackbook开发交给apache监管后,已经被众人所熟悉,我要讲的就是thrift中的一些问题:
1.当前的thrift-0.8.0版本存在很多问题,0.9正在众大神打patch中,相信不久就会release。
由于thrift-0.8.0版本在gcc >4.6版本时,编译应用程序是会报VERSION_1、VERSION_2、VERSION_MASK 错误,因此需要修改
1)、lib/cpp/src/protocol/TBinaryProtocol.h
static const int32_t VERSION_MASK = 0xffff0000;
static const int32_t VERSION_1 = 0x80010000;
修改为:
static const int32_t VERSION_MASK = ((int32_t)0xffff0000);
static const int32_t VERSION_1 = ((int32_t)0x80010000);
2)、lib/cpp/src/protocol/TDenseProtocol.h
static const int32_t VERSION_MASK = 0xffff0000;
static const int32_t VERSION_2 = 0x80020000;
修改为:
static const int32_t VERSION_MASK = ((int32_t)0xffff0000);
static const int32_t VERSION_2 = ((int32_t)0x80020000);
另外对于0.8的自带cpp例子,Makefile中需要加入编译选项-DHAVE_NETINET_IN_H ,并且需要将-lthrift编译选项放到最后,不然会编不过。python的自带例子server端的参数 有问题需要将9090改为port=9090
2.对于thrift的nonblockingserver,需要在编译选项中加入-lthrift-lthriftnb–levent,不然会发生编译错误,用该server还得装libevent!
3.若运行python的例子,出现no module named thrift.thrift,需在lib/python下运行python setup.py install.
4.由于跨语言的原因,thrift不支持多重继承,不支持输出参数。默认参数虽然能编译通过,但底层生成代码并不支持。另外,thrift也不支持一个端口多个server的情形,虽然有人提交了java的patch,通过一个注册函数实现了这个方式,但thrift认为这种行为是不必要的,并没有将其纳入新的版本中。
5.thrift支持完整的async机制,关于c++的异步客户端的支持我将在下篇博文中阐述清楚。另外关于一些不常见的用法我也将一一解释。