Thrift的安装和简单演示样例

时间:2022-12-22 00:23:53

本文仅仅是简单的解说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. &lbrack;hadoop系列&rsqb;Pig的安装和简单演示样例

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

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

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

  3. Introspector&lpar;内省&rpar;简单演示样例 与 简单应用

    简单演示样例: 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的&OpenCurlyDoubleQuote;无私”健壮性

    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. RunLoop笔记

    1.Runloop基础知识 - 1.1 字面意思 a 运行循环 b 跑圈 - 1.2 基本作用(作用重大) a 保持程序的持续运行(ios程序为什么能一直活着不会死) b 处理app中的各种事件(比如 ...

  2. 成为 Web 开发大师你必须知道的 7 件事情

    曾经是这样的,懂点编码,并可以偶尔耍点酷,那么你就会被认为是一个Web开发大师.但是现在,情况再也不是这样的了.Web开发已经朝着主流方向发展,开发人员数量显著增加.这意味着,如果你想成为这个领域的大 ...

  3. 在linux下python爬虫进程发生异常时自动重启直至正常结束的方法

    之前在做爬虫的时候遇到一种情况,当网络情况不太好的时候,爬虫爬到的链接在urlopen时会因为无法正常连接而报URLError或者timeout的错误导致陈序报错而终止:但是这些错误在重新运行陈序后能 ...

  4. Device Path in WinPrefetchView

    As we know that the Prefetch file is used for optimizing the loading time of the application in the ...

  5. BZOJ 3676 回文串

    Description 考虑一个只包含小写拉丁字母的字符串\(s\).我们定义\(s\)的一个子串\(t\)的"出现值"为\(t\)在\(s\)中的出现次数乘以\(t\)的长度.请 ...

  6. Javabean的理解

    1.Javabean是指满足指定规则的Java类.满足的规则由Sun公司提出,如x,setX,getX等规范,public无参构造函数等 2.Javabean其实也是一种规范.

  7. HDU 5012 Dice DFS

    简单DFS //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler #include <stdio.h ...

  8. windows&sol;linuxjdk安装,jdk1&period;6升级到1&period;7

    一.JDK: JAVA_HOME: C:\Program Files\Java\jdk1.7.0_79 PATH: ;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin CLASS ...

  9. Kosaraju算法解析&colon; 求解图的强连通分量

    Kosaraju算法解析: 求解图的强连通分量 欢迎探讨,如有错误敬请指正 如需转载,请注明出处 http://www.cnblogs.com/nullzx/ 1. 定义 连通分量:在无向图中,即为连 ...

  10. mysql distinct 去重

    在使用MySQL时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count( ...