On Ubuntu installing libssl-dev package should fix it.
sudo apt-get install libssl-dev
git clone https://git-wip-us.apache.org/repos/asf/thrift.git thrift
cd thrift/ git checkout 0.9.3 或者下载版本解压到指定文件(/work/thrift/)目录
安装依赖
sudo apt-get install libssl-dev sudo apt-get install byacc sudo apt-get install bison sudo apt-get install flex sudo apt-get install libevent-dev
生成编译文件
cd /work/thrift ./bootstrap.sh
说明:如果提示:
apt-get install libtool
则:sudo apt-get install libtool
(略过)
./configure --libdir=/usr/lib --without-go --without-java
or .
/configure
--with-cpp --with-boost
--without-python
--without-csharp --without-java --without-erlang --without-perl --without-php --without-php_extension --without-ruby --without-haskell --without-go
说明:安装thrift 0.9 时 configure: error: "Error: libcrypto required."
On Ubuntu installing libssl-dev package should fix it.
sudo apt-get install libssl-dev
http://stackoverflow.com/questions/9123457/configure-thrift-libcrypto-required
编译
make
测试
make check (略过)
sudo make install
注意:
struct message
{
1:i32 seqId,
2:string content
}
service serDemo
{
void put(1:message msg)//说明:可以有返回值的
}
class serDemoHandler : virtual public serDemoIf {
public:
serDemoHandler() {
// Your initialization goes here
}
void put(const message& msg) {
// Your implementation goes here
printf("receive message: id: %d, content: %s\n", msg.seqId, msg.content.c_str());
}
上面是server框架的代码,对于client的框架其实已经创建,但是现在需要添加client执行代码,可以在该目录下创建client.cpp,然后输入以下内容,下面的内容可以作为SimpleServer的client的模板,只需修改注释的部分。
// -------------------------替换成对应service名字的.h 文件------------------------
#include "SerDemo.h"
//------------------------------------------------------------------------------
#include
#include
#include
using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;
using boost::shared_ptr;
int main(int argc, char **argv) {
boost::shared_ptr socket(new TSocket("localhost", 9090));
boost::shared_ptr transport(new TBufferedTransport(socket));
boost::shared_ptr protocol(new TBinaryProtocol(transport));
transport->open();
// ----------------------------我们的代码写在这里------------------------------
message msg;
msg.seqId = 1;
msg.content = "client message";
serDemoClient client(protocol);
client.put(msg);
//--------------------------------------------------------------------------
transport->close();
return 0;
}
然后就可以执行了,启动server后,启动client,server执行如下:
anonymalias@anonymalias-Rev-1-0:~/code/thriftSerDemo/gen-cpp$ ./server
receive message: id: 1, content: client message
thrift也提供了异步客户端的实现,但生成代码时需要添加cob_style属性,即运行以下命令:
生成的代码中包含一个AsynClient的类以供实现异步调用,初步看到是使用回调函数进行的。
此种方法正在研究中,随后会将研究结果补充上来
服务端异步
Thrift服务端异步通过使用TNonblockingServer实现,TNonblockingServer依赖libevent,即编译Thrift时系统必须已经安装libevent,否则编译出的Thrift不包含TNonblockingServer的实现,ubuntu安装libevent使用如下命令:
同时使用TNonblockingServer时,应用程序编译命令也需要添加 -lthriftnb -levent。使用TNonblockingServer的代码如下:
TNonblockingServer也可以不使用线程池,仅仅使用单线程处理,此时只需在构造TNonblockingServer时不添加threadManager即可,如以下代码:
TNonblockingServer区别于其他server(例如TThreadPoolServer)在于:TNonblockingServer使用epoll与udp协议(TFramedTransport传输方式)实现,这样既可使用很少的线程实现大并发,而不会像TThreadPoolServer那样并发受线程池线程数限制。
所以使用TNonblockingServer的异步也仅仅是server内部实现思想上的异步,将线程池的阻塞线程处理请求改为了非阻塞串行处理,TNonblockingServer调用serve方法时本身还是会阻塞调用线程。
调用serve方法不阻塞方法应该也很多,并且还有服务端callback方式,有时间找到再补上来吧