本文仅仅是简单的解说Thrift开源框架的安装和简单使用演示样例。对于具体的解说,后面在进行阐述。

Thrift简述                                                                       

Thrift是一款由Fackbook开发的可伸缩、跨语言的服务开发框架,该框架已经开源而且增加的Apache项目。Thrift主要功能是:通过自己定义的Interface Definition Language(IDL),能够创建基于RPC的client和服务端的服务代码。服务代码的生成是通过Thrift内置的代码生成器来实现的。Thrift的跨语言性体如今,它能够生成C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript,
Node.js, Smalltalk, OCaml , Delphi等语言的代码,且它们之间能够进行透明的通信。

Thrift的安装                                                                   

安装版本号为:Thrift v0.9.1

系统版本号:Ubuntu 14.04 64位

基本安装环境:

  • g++ 4.2
  • boost 1.53.0
  • libssl-dev
  • libevent & libevent-dev(不是必须的,支持TNonblockingServer须要)

Thrift的编译器即代码生成器是由C++编写的,所以须要g++来进行编译安装,且Thrift源代码中用到了boost库中相关实现,比如shared_ptr。所以要事先安装boost库。

Thrift通信过程中使用ssl对数据进行安全保护,假设没有安装该库,会在configure时出现configure: error: "Error: libcrypto required."

Thrift提供了。TThreadSever, TThreadPoolServer, TNonblockingServer四种server框架,TSimpleServer以单一主线程堵塞的方式进行事件处理。TThreadPoolServer以多线程堵塞的方式提供服务。TNonblockingServer以多线程非堵塞方式工作。

TNonblockingServer服务模型的使用须要事先安装libevent。libevent-dev库,libevent是异步事件处理的网络库,其底层通过系统支持的I/O
multiplexer :poll,select,epoll等进行事件监听和分发。

安装步骤:

$./configure
$make
#sudo make install

configure的结果最后一部分例如以下。当中Build TNonblockingServer .. : yes的结果对于使用异步的server模型是必须的。

anonymalias@anonymalias-Rev-1-0:~/download/thrift-0.9.1$./configure
......
thrift 0.9.1 Building C++ Library ......... : yes
Building C (GLib) Library .... : no
Building Java Library ........ : no
Building C# Library .......... : no
Building Python Library ...... : yes
Building Ruby Library ........ : no
Building Haskell Library ..... : no
Building Perl Library ........ : no
Building PHP Library ......... : no
Building Erlang Library ...... : no
Building Go Library .......... : no
Building D Library ........... : no C++ Library:
Build TZlibTransport ...... : yes
Build TNonblockingServer .. : yes
Build TQTcpServer (Qt) .... : no Python Library:
Using Python .............. : /usr/bin/python If something is missing that you think should be present,
please skim the output of configure to find the missing
component. Details are present in config.log.

在本人电脑上make的时候会出现以下的bug,

ar: .libs/ThriftTest_constants.o: No such file or directory

不知道Makefile怎样生成的,导致上面这个编译文件路径有问题,解决方法有以下两种:

method1:
能够将已经编译的test/cpp/*.o拷贝到test/cpp/.libs后。继续编译就能够了
cp test/cpp/*.o test/cpp/.libs/ method2(未測试):
直接从Github(git://git.apache.org/thrift.git)上git clone 源代码,先执行./bootstrap.sh。在依照configure安装。

Thrift的简单演示样例                                                            

首先创建Thrift的语法规则文件,命名为server.thrift,内容例如以下:

struct message
{
1:i32 seqId,
2:string content
} service serDemo
{
void put(1:message msg)
}

在shell以下运行运行:

thrift -gen cpp server.thrift

该语句用于创建c++服务框架,创建成功后会在该文件夹下生成gen-cpp文件夹,然后改动该文件夹下的serDemo_server.skeleton.cpp,在put函数中加入例如以下代码:

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());
}

然后进行编译就能够了:g++ -o server *.cpp -lthrift

上面是server框架的代码,对于client的框架事实上已经创建。可是如今须要加入client运行代码,能够在该文件夹下创建client.cpp,然后输入以下内容,以下的内容能够作为SimpleServer的client的模板,仅仅需改动凝视的部分。

// -------------------------替换成相应service名字的.h  文件------------------------
#include "SerDemo.h"
//------------------------------------------------------------------------------
#include <thrift/transport/TSocket.h>
#include <thrift/transport/TBufferTransports.h>
#include <thrift/protocol/TBinaryProtocol.h> 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<TSocket> socket(new TSocket("localhost", 9090));
boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));
boost::shared_ptr<TProtocol> 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;
}

然后进行编译:g++ -o client *[^n].cpp - lthrift,也能够将serDemo_server.skeleton.cpp移动到其他文件夹,使用g++ -o client *.cpp - lthrift命令。

然后就能够运行了。启动server后。启动client。server运行例如以下:

anonymalias@anonymalias-Rev-1-0:~/code/thriftSerDemo/gen-cpp$ ./server
receive message: id: 1, content: client message

下周打算翻译Thrift Whitepaper,come on!

Thrift的安装和简单演示样例的更多相关文章

  1. [hadoop系列]Pig的安装和简单演示样例

    inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish ).(来源:http://blog.csdn.net/inkfish) Pig是Yaho ...

  2. Libevent 学习笔记 (1)——Libevent 2.0安装与简单演示样例

    今天開始学习Libevent . Libevent 是开源社区的一款高性能I/O框架库. 主要特点有: 1 跨平台. 2 统一事件源 3 线程安全 4 基于Reactor 今天主要进行了Libeven ...

  3. Introspector(内省)简单演示样例 与 简单应用

    简单演示样例: package com.asdfLeftHand.test; import java.beans.BeanDescriptor; import java.beans.BeanInfo; ...

  4. JBoss 系列九十六:JBoss MSC - 简介及一个简单演示样例

    什么是 JBoss MSC JBoss MSC 即 JBoss Modular Service Container,是第三代 JBoss 产品 JBoss 7和WildFfly的内核,JBoss MS ...

  5. 一则简单演示样例看Oracle的“无私”健壮性

    Oracle的强大之处就在于他能总帮助让你选择正确的运行计划,即使你给了它错误的指示. 实验: 1. 创建測试表: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZ ...

  6. Android通过startService播放背景音乐简单演示样例

    关于startService的基本使用概述及其生命周期可參见博客<Android中startService的使用及Service生命周期>. 本文通过播放背景音乐的简单演示样例,演示sta ...

  7. 百度地图 Android SDK - 检索功能使用的简单演示样例

    百度地图 SDK 不仅为广大开发人员提供了炫酷的地图展示效果.丰富的覆盖物图层,更为广大开发人员提供了多种 LBS 检索的能力. 通过这些接口,开发人员能够轻松的訪问百度的 LBS 数据,丰富自己的移 ...

  8. RHEL5 X86-64上安装Oracle 11gR2演示样例与总结

    进入Oracle DBA行业也有好几年了,可是说到安装Oracle的经验,我还真不是特别多,印象中刚開始每次安装都有点磕磕碰碰,随着接触Oracle的时间越来越长,各方面的原理.机制也都有一定的了解后 ...

  9. MyBatis对数据库的增删改查操作,简单演示样例

    之前一直有用Hibernate进行开发.近期公司在使用Mybatis.依据网上的演示样例,做了一个简单的Demo,以便日后复习 使用XMl方式映射sql语句 整体结构例如以下图 watermark/2 ...

随机推荐

  1. 基于简单sql语句的sql解析原理及在大数据中的应用

    基于简单sql语句的sql解析原理及在大数据中的应用 李万鸿 老百姓呼吁打土豪分田地.共同富裕,总有一天会实现. 全面了解你所不知道的外星人和宇宙真想:http://pan.baidu.com/s/1 ...

  2. android 滚动视图(ScrollView)

    为了可以让内嵌布局管理器之中加入多个显示的组件,而且又保证程序不这么冗余,所以可以通过 Activity程序进行控制,向内嵌布局管理器中添加多个组件. ScrollView提供一个显示的容器,可以包含 ...

  3. VMware上实现LVS负载均衡(NAT)

    本文LVS的实现方式採用NAT模式.关于NAT的拓扑图请參照我的上一篇文章.本文纯粹实验.NAT在生产环境中不推荐使用.原因是Load Balancereasy成为瓶颈! 1.VMware9上安装Ce ...

  4. magento产品eav笔记【持续跟新...】

    //magento把产品信息分在子表中,最顶上的表是catalog_product_entity,仅仅包含产品的信息(SKU) //表eav_attribute,这张表在magento里为全部不 同的 ...

  5. LIB文件和DLL文件的作用

    (1)lib是编译时需要的,dll是运行时需要的.如果要完成源代码的编译,有lib就够了.如果也使动态连接的程序运行起来,有dll就够了.在开发和调试阶段,当然最好都有.(2)一般的动态库程序有lib ...

  6. ubuntu server 14.04.4 无线网卡没有启用,找不到wlan0端口

    Ubuntu Server默认的情况下是不会启用无线网卡的,想想实际服务器上怎么可能有无线网卡呢,呵呵.所以我们需要手动来启用无线网卡,难点就在这里了. 使用ifconfig命令,发现没有wlan口, ...

  7. Windows下Node.js开发环境搭建-合适的开发环境

    1)生产环境中的Node.js应用 Windows + Linus 2)虚拟机工具 VirtualBox 虚拟机CentOS安装 3)xShell与xFtp(windows到linux文件传输) 4) ...

  8. (转)jQuery插件开发全解析

    jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...

  9. log4net截取配置错误信息,(验证配置信息是否配置正确)

    在</system.web>之后 <!--log4错误日志配置:开始--> <system.diagnostics> <trace autoflush=&qu ...

  10. 使用.NET框架、Web service实现Android的文件上传(二)

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYUAAAKpCAIAAADcx6fPAAAgAElEQVR4nOydd1hT5+LHg1attbfr1t ...