转载自Thrift在Windows及Linux平台下的安装和使用示例

thrift介绍

Apache Thrift 是 Facebook 实现的一种高效的、支持多种编程语言的RPC(远程服务调用)框架。

本文主要目的是分别介绍在Windows及Linux平台下的Thrift安装步骤,以及实现一个简单的demo演示Thrift的使用方法。更多Thrift原理留在以后再行介绍。

thrift安装

源码下载:thrift官网,或者thrift-github地址,我下载的是thrift-0.9.3.tar.gz。

安装依赖库

  1. boost
    boost的编译就不再这里介绍了,我分别使用了boost1.55或boost1.49编译通过;
  2. libevent
    按需编译,如果不需要异步server就可以不编译libevent,否则可以点此下载libevent-2.0.21-stable;
  3. openssl
    下载针对你系统版本的openssl库,windows下有编译好的二进制文件,可以直接下载,32位/62位系统openssl; Linux发行版一般都自带ssl库;

thrift在Windows下的安装

我是在Windows7 64bit, VS2010编译的。 Windows下编译倒也不麻烦,简单介绍如下:

  1. 解压缩源代码,进入到lib\cpp目录下,打开Thrift.sln,里面有libthrift和libthriftnb两个工程,其中libthrift工程是常规的阻塞型server端(单线程server,一个连接一个线程server,线程池server),libthriftnb工程是非阻塞(non-blocking)模式的服务server端,也只有编译libthriftnb时才需要依赖libevent库,否则可以不编译libevent库;
  2. 设置依赖库头文件和库文件,这就不再介绍了;
  3. 编译,顺利的话就OK了,会在lib\cpp\Debug目录下生成libthrift.lib和libthriftnb.lib(如果编译的话);

说明: thrift-0.9.3这一版的release其实在windows下是编译不过的,因为vs工程中要编译的Thrift.cpp已经不存在了,从工程中移除就可以顺利编译了,参考thrift-pull-739。

另外还可以自行编译thrift文件的生成工具,当然也可以直接从官网下载,这里给出编译步骤:

  1. 将compiler\cpp\src\windows\version.h.in文件拷贝到compiler\cpp\src\目录下,并重命名为version.h;
  2. 到compiler\cpp目录下,打开compiler.sln,编译即可

thrift在linux(Centos)下的安装

我是在Centos6.4 64bit,g++ 4.4.7编译的,编译很简单,分别可以使用cmake或者make工具进行编译,这里不再多做介绍,当然,编译过程中缺少了某些库什么的,就先按照即可,更详细的步骤请看本文的参考文章链接。

开发步骤

  1. 写一个.thrift文件,也就是IDL(Interface Description File,接口描述文件);
  2. 用Thrift的IDL生成工具(windows下就是上面提供下载链接的thrift-0.9.1.exe, Linux下就是/usr/local/bin/thrift程序) ,然后根据需要生成目标语言代码;
  3. server端程序引入第2步生成的代码,实现RPC业务代码;
  4. client端程序引入第2步生成的代码,实现RPC调用逻辑;
  5. 用第4步生成的程序就可以调用第3步实现的远程服务了;

入门示例

下面就演示一个简单的server端和client端程序。

设计thrift文件(IDL)

假设实现这么一个简单服务,client通过hello接口发送自己的名字,且需要server端回复,比如 hello.thrift:

service HelloService
{void hello(1: string name);
}

通过IDL工具生成源代码

执行thrift命令生成源文件

thrift --gen cpp hello.thrift                 # centos下
thrift-0.9.3.exe --gen cpp hello.thrift   # Windows下
thrift-0.9.3.exe --gen py hello.thrift    # Windows下python代码

以上命令表示生成C++语言的源代码,然后会生成一个gen-cpp目录,里面包含自动生成的几个源代码文件:

hello_constants.cpp
hello_constants.h
HelloService.cpp
HelloService.h
HelloService_server.skeleton.cpp
hello_types.cpp
hello_types.h

实现server端程序

HelloService_server.skeleton.cpp就是默认的server端程序入口,可以直接修改该文件,或者拷贝一份再做修改(我是拷贝并重命名为server.cpp),以便增加自己的逻辑处理:

class HelloServiceHandler : virtual public HelloServiceIf {public:HelloServiceHandler() {// Your initialization goes here}void hello(const std::string& name) {// Your implementation goes here// 这里只简单打印出client传入的名称printf("hello, I got your name %s\n", name.c_str());}
};

如果是在linux平台下,直接通过g++编译:

g++ -o server hello_constants.cpp  HelloService.cpp hello_types.cpp  server.cpp -I/usr/local/include/thrift -L/usr/local/lib -lthrift

如果是在Windows平台下,通过vs2010新建win32控制台工程,将gen-cpp目录下的所有文件复制到新工程下,设置头文件包含和lib库目录。 比如设置libthrift.lib的头文件目录为thrift-0.9.3\lib\cpp\src\thrift,lib库目录为thrift-0.9.3\lib\cpp\Debug。

实现client端程序

因为没有默认的client实现,所以需要新建一个client.cpp文件,自己增加实现:

#include <stdio.h>
#include <string>
#include "transport/TSocket.h"
#include "protocol/TBinaryProtocol.h"
#include "server/TSimpleServer.h"
#include "transport/TServerSocket.h"
#include "transport/TBufferTransports.h"
#include "hello_types.h"
#include "HelloService.h"
using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;
using boost::shared_ptr;int main(int argc, char** argv)
{shared_ptr<TTransport> socket(new TSocket("localhost", 9090));shared_ptr<TTransport> transport(new TBufferedTransport(socket));shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));HelloServiceClient client(protocol);try{transport->open();client.hello("cpper.info");transport->close();}catch(TException& tx){printf("ERROR:%s\n",tx.what());}
}

如果是在linux平台下,直接通过g++编译:

g++ -o client client.cpp hello_constants.cpp  HelloService.cpp hello_types.cpp -I/usr/local/include/thrift -L/usr/local/lib -lthrift

如果是在Windows平台下,通过vs2010新建win32控制台工程,将gen-cpp目录下的所有文件(除HelloService_server.skeleton.cpp之外)复制到新工程下,并增加上面手动实现的client.cpp

通过以上步骤,就实现一个简单的RPC server和client程序了,可以分别运行进行测试看看效果怎么样。

Reference

Thrift官方安装手册(译)

(转)Thrift在Windows及Linux平台下的安装和使用示例相关推荐

  1. Thrift在Windows及Linux平台下的安装和使用示例

    thrift介绍 Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的RPC(远程服务调用)框架. 本文主要目的是分别介绍在Windows及Linux平台下的Thri ...

  2. Linux平台下二进制安装FastDDS

    1. Linux平台下二进制安装 该页面主要介绍在linux环境下,使用二进制release安装 eProsima公司的 Fast DDSThe. 安装 内容 运行应用 在一个CMake项目中包含Fa ...

  3. clock在linux下单位,将clock_t转化为秒值在Windows与Linux平台下的差异

    平时写测试程序的时候常常要计算程序执行的时间,尤其是最近练习Intel多核编程时,需要判断打开openmp参数与否的执行时间的比较. 通常代码是这样写的: #include clock_t start ...

  4. 【VP9】libvpx在Windows和Linux平台下的编译和vp9编解码器的命令行参数

    =================================================================== 参考:https://www.cnblogs.com/endv/ ...

  5. Redis在Windows+linux平台下的安装配置(转)

    window平台Redis安装 下载地址: http://code.google.com/p/servicestack/wiki/RedisWindowsDownload Redis文件夹有以下几个文 ...

  6. 【C语言】标准库(头文件、静态库、动态库),windows与Linux平台下的常用C语言标准库

    一.Introduction 1.1 C语言标准库 1.2 历代C语言标准 1.3 主流C语言编译器 二.C语言标准库 2.1 常用标准头文件 2.2 常用标准静态库 三.windows平台 四.Li ...

  7. java aes加密 linux和windows,AES加密在windows與linux平台下顯示結果不同,解決方案

    現象描述: 在 windows 操作系統下加解密正常,但部署到 linux 環境中相同的輸入加密結果不正確,並且每次運行返回的結果都不同.也就是說在windows下加解密都正常,一但部署到linux下 ...

  8. linux头文件与windows头文件,socklen_t在windows和linux平台下的头文件定义

    5-udev多路径 udev多路径 查看scsi的唯一标识符 用这个计算机可以识别 重启服务 想要看到下面的,可能重启服务也不行,那就需要重启计算机了 虚拟磁盘 安装这个包multipath 重启服务 ...

  9. linux如何安装python环境变量中,Windows和linux环境下python安装及环境变量的配置

    安装包的安装 无需双版本存在情况下安装 1)下载源码包 2)解压源码包并进入文件夹 ./configure ; make && make install 3)使用python -V查看 ...

最新文章

  1. 速看,三分钟带你了解IP协议!
  2. boost::geometry::strategy::distance::pythagoras_point_box用法的测试程序
  3. VTK:图片之ImageVariance3D
  4. 挖一挖曹大 holmes 的设计与实现
  5. 浪迹天涯的骨灰级开源爱好者——对话阿里云MVP吴晟
  6. Qt、GTK 和KDE、GNOME的关系-转
  7. android 获取全局context,说说 Android 中如何在全局获取 Context
  8. 数据可视化工具软件哪个最好
  9. 并行学习框架下基于GAN的城市道路网短时路段交通预测方法
  10. mysql建表数据字典_一种数据字典表的创建方式
  11. 城市规划设计毕业论文范文
  12. react 输入框 回车事件切换
  13. mysql if 多个,mysql多个if语句
  14. python3 工作上一些正则表达式
  15. 非全研究生业余研究:利用十一假期训练了室内定位模型
  16. 大厂面试:一个四年多经验程序员的BAT面经(字节、阿里、腾讯)
  17. GET 请求能传图片吗?
  18. 红帽RHCE考试下午-RHCE (RH294)任务概览[2021最新版]
  19. pytorch局部范围内禁用梯度计算,no_grad、enable_grad、set_grad_enabled使用举例
  20. IBM服务器U盘安装CentOS6.8系统

热门文章

  1. php上下属对应关系,由主分类 ID 取出(多个)下级子分类所对应的项,有没有什么好的办法?(其实似乎和 PHP 没什么直接关系?)...
  2. ARM 汇编学习——编写简单的ARM汇编程序
  3. [Python2.x] 标准库 urllib2 的使用细节
  4. 带CheckBox的CListCtrl,源码可下载
  5. 斐波那契数列;递归函数;爬楼梯问题;
  6. JAVA进阶day07JNI(java调用c)A部分
  7. React面试题目录汇总
  8. 前端学习(3230):React中的非受控组件
  9. react学习(6)----react样式多用内联
  10. 工作407-启动vue项目出现Module build failed (from ./node_modules/sass-loader/dist/cjs.js): ValidationError: I