`
longgangbai
  • 浏览: 7325568 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多

一、ubuntu下thrift的安装

1.下载源代码
http://thrift.apache.org/download/
下载最新版本thrift-0.8.0.tar.gz

2.安装boost库
sudo apt-get install libboost-dev libboost-dbg libboost-doc bcp libboost-*
 
3.安装其他相关工具包
sudo apt-get install libboost-dev libboost-test-dev libboost-program-options-dev libevent-dev automake libtool flex bison pkg-config g++ libssl-dev ant
如果需要支持java,需要安装jdk,配置java环境变量。
 
4.解压文件,进入目录thrift-0.8.0安装
./configure --with-cpp --with-boost --without-python --without-csharp --with-java --without-erlang --without-perl --with-php --without-php_extension --without-ruby --without-haskell  --without-go
make
sudo make install
要支持java,需要编译生成jar包,到lib/java目录下,执行ant命令。将在lib/java/build目录下生成libthrift-0.8.0.jar和libthrift-0.8.0-javadoc.jar。编译过程中,可能出错,需要检查lib/java/build/tools/maven-ant-tasks-2.1.3.jar是否正确下载。
 
5.测试
直接输入thrift命令,看是否有用法提示 
 
二、thrift自带的测试样例
进入tutorial文件夹,shared.thrift和tutorial.thrift是接口定义文件。
thrift -r --gen java tutorial.thrift
thirft -r --gen cpp tutorial.thrift
执行这两条命令可以生成gen-java和gen-cpp两个文件夹,这些是thrift编译器自动生成的代码。
 
然后到java目录下,执行ant命令,编译成功后,在两个不同的窗口下执行以下命令:
./JavaServer
./JavaClient simple
 
进入cpp目录下,执行make命令,如果编译出错,第一个错误是
/usr/local/include/thrift/protocol/TBinaryProtocol.tcc:147:35: error: there are no arguments to ‘htons’ that depend on a template parameter, so a declaration of ‘htons’ must be available
则修改Makefile,加上编译选项-DHAVE_NETINET_IN_H
server: CppServer.cpp
        g++ -DHAVE_NETINET_IN_H -o CppServer -I${THRIFT_DIR} -I${BOOST_DIR}  -I../gen-cpp -L${LIB_DIR} -lthrift CppServer.cpp ${GEN_SRC}
 
client: CppClient.cpp
        g++ -DHAVE_NETINET_IN_H -o CppClient -I${THRIFT_DIR} -I${BOOST_DIR}  -I../gen-cpp -L${LIB_DIR} -lthrift CppClient.cpp ${GEN_SRC}
编译通过生,将生成CppClient和CppServer两个可执行程序。同样,在两个不同的窗口执行以下命令:
./CppServer
./CppClient
而且java和c++的Client和Server都可以交叉运行。比如运行JavaServer和CppClient也能得到同样的结果。以此达到了多语言的相互调用。
 
三、Hello World
仿照tutorial,写一个简单的hello world。在tutorial平级目录下,建立目录hello,这里只是为了测试需要。
服务端用java,客户端用java和c++。
 
1. 编写tt.thrift
namespace java demo
namespace cpp demo
 
service Hello{
  string helloString(1:string para)
}
 
2. 编译生成代码
thrift -r --gen java tt.thrift
thrift -r --gen cpp tt.thrift
生成gen-java和gen-cpp两个文件夹
gen-cpp下有如下文件
Hello.cpp  Hello.h  Hello_server.skeleton.cpp  tt_constants.cpp  tt_constants.h  tt_types.cpp  tt_types.h
其中Hello.h,Hello.cpp中定义了远程调用的接口,实现了底层通信。可以在Hello.h中找到客户端远程调用需要用到的类HelloClient,调用方法:
void helloString(std::string& _return, const std::string& para);
这个跟thrift文件中申明的方法有点不一定,返回参数是通过引用传回来的。
Hello_server.skeleton.cpp将实现Hello.h的服务端接口,如果要用c++作为服务端,还需要将这个文件拷出去,重命名,实现类HelloHandler的方法helloString,远程调用方法的业务逻辑也就写在helloString中。可能还需要改main函数中的端口信息。
gen-java/demo下只有Hello.java一个文件,它定义了服务端和客户端的接口,实现了底层的通信。
 
3. 编写java服务端和客户端
仿照tutorial,在hello目录下建立java目录,将tutorial/java/下的一些文件和目录拷到hello/java下
build.xml JavaClient  JavaServer  src
删除src下所有文件,在src下编写代码。
 
1) HelloImpl.java 远程过程调用的业务逻辑
import demo.*;
import org.apache.thrift.TException;
 
class HelloImpl implements Hello.Iface {
 public HelloImpl() {}
 public String helloString(String para) throws org.apache.thrift.TException {
        //各种业务逻辑
         return "hello " + para;
 }
}
 
2) Server.java  服务端程序
import demo.*;
import java.io.IOException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer.Args;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
 
public class Server {
private void start() {
try {
    TServerSocket serverTransport = new TServerSocket(7911);
    Hello.Processor processor = new Hello.Processor(new HelloImpl());
    Factory protFactory = new TBinaryProtocol.Factory(true, true);
    Args args = new Args(serverTransport);
    args.processor(processor);
    args.protocolFactory(protFactory);
    TServer server = new TThreadPoolServer(args);
    //TServer server = new TThreadPoolServer(processor, serverTransport, protFactory);
    System.out.println("Starting server on port 7911 ...");
    server.serve();
 
   } catch (TTransportException e) {
    e.printStackTrace();
   } catch (Exception e) {
    e.printStackTrace();
}
}
 
public static void main(String args[]) {
    Server srv = new Server();
    srv.start();
}
}
 
3) Client.java 客户端程序
import demo.*;
import java.io.IOException;
import org.apache.thrift.*;
import org.apache.thrift.protocol.*;
import org.apache.thrift.transport.*;
 
public class Client {
      public static void main(String [] args) {
           try {
                    TTransport transport = new TSocket("localhost", 7911);
                    TProtocol protocol = new TBinaryProtocol(transport);
                    Hello.Client client = new Hello.Client(protocol);
                    transport.open();
                    System.out.println("Client calls hello");
                    System.out.println(client.helloString("world"));
                    transport.close();
               } catch (TException x) {
                    x.printStackTrace();
               }
        }
}
 
4) 修改 build.xml
<project name="hello" default="hello" basedir=".">
 
  <description>Thrift Hello</description>
 
  <property name="src" location="src" />
  <property name="gen" location="../gen-java" />
  <property name="build" location="build" />
 
  <path id="libs.classpath">
    <fileset dir="http://www.cnblogs.com/lib/java/build">
      <include name="*.jar" />
      <exclude name="-test.jar" />
    </fileset>
    <fileset dir="http://www.cnblogs.com/lib/java/build/lib">
      <include name="*.jar" />
    </fileset>
  </path>
  <path id="build.classpath">
    <path refid="libs.classpath" />
    <pathelement path="${gen}" />
  </path>
 
  <target name="init">
    <tstamp />
    <mkdir dir="${build}"/>
  </target>
 
  <target name="compile" depends="init">
    <javac srcdir="${gen}" destdir="${build}" classpathref="libs.classpath" />
    <javac srcdir="${src}" destdir="${build}" classpathref="build.classpath" />
  </target>
 
  <target name="hello" depends="compile">
    <jar jarfile="hello.jar" basedir="${build}"/>
  </target>
 
  <target name="clean">
    <delete dir="${build}" />
    <delete file="hello.jar" />
  </target>
 
</project>
 
5) 编译
ant
将生成build文件夹
Client.class  demo  hello  HelloImpl.class  hello.jar  Server.class
 
6) 修改执行脚本
JavaClient
java -cp http://www.cnblogs.com/lib/java/build/lib/*:http://www.cnblogs.com/lib/java/build/*:hello.jar Client
JavaServer
java -cp http://www.cnblogs.com/lib/java/build/lib/*:http://www.cnblogs.com/lib/java/build/*:hello.jar Server
 
4. 编写c++客户端
同样仿照tutorial,将tutorial/cpp中的Makefile和CppClient.cpp拷到hello/cpp下。
 
1) 将CppClient.cpp重命名为Client.cpp,并修改
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
 
#include <protocol/TBinaryProtocol.h>
#include <transport/TSocket.h>
#include <transport/TTransportUtils.h>
 
#include "../gen-cpp/Hello.h"
#include <string>
 
using namespace std;
using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;
 
using namespace demo;
 
using namespace boost;
 
int main(int argc, char** argv) {
  shared_ptr<TTransport> socket(new TSocket("localhost", 7911));
  shared_ptr<TTransport> transport(new TBufferedTransport(socket));
  shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
  HelloClient client(protocol);
 
  try {
    transport->open();
 
    string ret;
    client.helloString(ret, "world");
    printf("%s\n", ret.c_str());
 
    transport->close();
  } catch (TException &tx) {
    printf("ERROR: %s\n", tx.what());
  }
 
}
 
2). 修改Makefile
BOOST_DIR = /usr/local/boost/include/boost-1_33_1/
THRIFT_DIR = /usr/local/include/thrift
LIB_DIR = /usr/local/lib
 
GEN_SRC = ../gen-cpp/tt_types.cpp ../gen-cpp/Hello.cpp
 
default: client
 
client: Client.cpp
        g++ -DHAVE_NETINET_IN_H -o client -I${THRIFT_DIR} -I${BOOST_DIR}  -I../gen-cpp -L${LIB_DIR} -lthrift Client.cpp ${GEN_SRC}
 
clean:
        $(RM) -r client
 
3). 编译
make
生成可执行文件client
 
5. 运行程序
运行服务端程序,java目录下:./JavaServer
运行客户端程序,cpp目录下:./client
这样c++程序通过 client.helloString(ret, "client") 可以调用服务端的java接口String helloString(String para)。
从而实现了远程多语言调用。
分享到:
评论

相关推荐

    php_thrift_python安装测试记录

    对于CentOS系统,可以使用以下命令安装Thrift: ```bash sudo yum install thrift-devel ``` 然后,使用Thrift编译器将.thrift文件转换为PHP和Python的代码: ```bash thrift --gen php my_service.thrift thrift...

    facebook thrift

    ### Facebook Thrift:可扩展的跨语言服务实现 #### 概述 Facebook Thrift是一种软件库及一组代码生成工具,由Facebook开发,旨在加速高效、可扩展后端服务的开发与实施。其主要目标是通过将每种语言中通常需要...

    C++(Qt)下的thrift的使用示例

    总的来说,“C++(Qt)下的thrift的使用示例”涵盖了在Qt环境下集成Thrift服务的基本步骤,包括安装依赖、编写IDL、生成代码、实现服务和客户端,以及利用Qt的特性来优化通信过程。理解并掌握这些知识,将有助于你在...

    Python库 | thrift_pyi-0.2.0-py3-none-any.whl

    安装“thrift_pyi-0.2.0-py3-none-any.whl”这个轮子文件非常简单,只需要在命令行中使用pip即可: ```bash pip install thrift_pyi-0.2.0-py3-none-any.whl ``` 安装完成后,你可以按照以下步骤使用Thrift PyI: ...

    thrift环境搭建(内附thrift运行环境可执行程序、搭建说明文本)

    安装成功后,可以通过运行`thrift --version`命令来检查Thrift是否已经正确安装。如果显示Thrift的版本信息,那么恭喜,你已经成功搭建了Thrift环境。 5. **编写IDL文件** 使用Thrift,你需要定义服务接口的IDL...

    thrift java build jar

    总结,使用 Thrift 在 Java 环境下构建 `.jar` 文件涉及了多个步骤,包括安装 Thrift、编写 IDL、生成 Java 代码、构建项目以及打包。这个过程有助于实现跨语言服务通信,提高系统的可扩展性和效率。通过遵循上述...

    thrift+依赖包整合

    在Windows 7环境下,这个整合包已经包含了所有必要的依赖,这意味着你不需要再额外安装其他组件即可开始使用Thrift。首先,你需要编写一个IDL文件来定义服务接口和数据类型。然后,使用Thrift编译器将IDL文件转换为...

    thrift操作Hbase数据库

    在C#环境中,我们需要安装Thrift的C#绑定库,并使用Thrift编译器将Hbase的Thrift IDL文件转换为C#代码。这些生成的代码包含了Hbase服务的客户端类,用于创建连接、执行操作等。 3. **连接Hbase** 使用Thrift生成...

    python thrift2 connect hbase

    在Python中使用Thrift2连接HBase,首先需要安装thrift库,可以使用pip命令进行安装: ``` pip install thrift ``` 接着,你需要下载HBase的Thrift IDL文件(通常为hbase.thrift),这个文件定义了HBase服务的所有...

    thrift jar包及相关学习步骤

    1. **安装Thrift**: 下载Thrift的源码或预编译的二进制包,配置环境变量,确保可以运行thrift命令。 2. **编写IDL文件**: 学习Thrift IDL语法,创建一个简单的服务接口和数据结构描述文件。 3. **生成代码**: 使用...

    thrift javascript example

    1. **安装Thrift**: 首先确保你已经安装了Thrift编译器。 2. **生成代码**: 使用Thrift编译器将`example.thrift`转换为JavaScript代码。 3. **运行服务端**: 启动`server.js`,它会在指定端口监听连接。 4. **运行...

    thrift-0.9.1

    4. **文档**:虽然描述中没有特别提到,但大多数开源项目都会包含一份文档,解释如何安装、配置和使用Thrift。这份文档可能包括用户指南、API参考以及开发者文档,帮助开发者更好地理解和应用Thrift。 5. **测试**...

    免安装,直接生成thrift代码工具(0.9.1版本)

    标题"免安装,直接生成thrift代码工具(0.9.1版本)"指的是一个特定版本的Thrift代码生成工具,即0.9.1版,该版本无需安装,可以直接运行,为开发者提供了便利。这个工具允许用户快速便捷地生成Thrift定义的服务在...

    thrift-0.5.0.tar.gz linux版本

    2. **编译脚本**:如`configure`和`makefile`,用于在Linux环境下编译和安装Thrift。 3. **Thrift IDL文件**:展示了如何使用Thrift IDL来定义服务和数据结构的示例。 4. **生成工具**:Thrift编译器`thrift`,用于...

    php通过thrift获取hadoop资源

    1. 安装和配置Thrift库:确保PHP环境已经安装了Thrift PHP扩展,并根据Hadoop服务配置相应的连接参数。 2. 创建Thrift服务接口定义:编写.thrift文件,定义需要的Hadoop操作。 3. 编译Thrift文件:使用Thrift编译器...

    flume通过thrift协议收集日志-Python

    1. **安装依赖**:在 Python 环境中,你需要安装 thrift 库,这可以通过 pip 安装:`pip install thrift`. 2. **创建 Thrift IDL 文件**:定义 Flume 与 Python 交互的 Thrift 接口。例如,定义一个包含日志消息的...

    thrift-0.13.0在Windows上exe程序.rar

    在Windows系统中,安装和使用Thrift通常涉及下载这个.exe文件,然后在命令行环境中调用它进行编译或生成服务接口。 标签"thrift"进一步确认了这个压缩包与Thrift框架相关。Thrift的主要应用包括: 1. **数据序列化...

    thrift_forPython3_0.9.3

    标题 "thrift_forPython3_0.9.3" 指的是一个针对Python 3的Thrift库的特定版本,版本号为0.9.3。...注意,可能还需要安装其他依赖,如Python的`thrift`和`happybase`库,以确保所有必要的组件都已就绪。

    thrift-0.10.0

    在压缩包文件"thrift-0.10.0.exe"中,我们可以看到这是一个Windows平台的安装程序,用于安装Thrift 0.10.0的编译器和相关库。安装后,用户将能够使用Thrift编译器将IDL文件转换为目标语言的源代码,并在项目中集成...

Global site tag (gtag.js) - Google Analytics