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

转载自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官方安装手册(译)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/408910.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CPP第四版第四章:创建动态数组

数组类型的变量有三个重要限制&#xff1a; 数组长度固定不变 在编译时必须知道其长度 数组只在定义它的块语句内存在 每一个程序在执行时都占用一块可用的内存空间&#xff0c;用于存放动态分配的对象&#xff0c;此内存空间称为程序的自由存储区或堆…

matlab中数据变为nan,字符转化为数值型中出现NAN

我将字符型转化为数值型&#xff0c;然后画图&#xff0c;结果图形没有曲线&#xff0c;这是怎么回事&#xff1f;我用的函数是str2double和str2num都试了&#xff0c;都不行。我的程序如下,其中的E2(i)的值我用matlab计算了&#xff0c;为什么是这么庞大的一个数&#xff1f;这…

(转)在Windows上安装GPU版Tensorflow

转载自在Windows上安装GPU版Tensorflow。 1. 下载安装Anaconda 简单说就是下载 64位 python 3.5 版本的Anaconda https://www.continuum.io/downloads#windows 安装情况&#xff1a;新机&#xff0c;未装python。 注意 a. Windows只支持64位 python 3.5 https://www.ten…

(转载)Linux僵死进程的产生与避免

&#xff08;转载&#xff09;http://blog.chinaunix.net/uid-23089249-id-210808.html一个进程在调用exit命令结束自己的生命的时候&#xff0c;其实它并没有真正的被销毁&#xff0c; 而是留下一个称为僵死进程&#xff08;Zombie&#xff09;的数据结构&#xff08;系统调用…

php怎么查询数据库密码,如何验证php中的密码是通过mysql查询手动散列插入到数据库中的?...

有没有办法通过自己的散列方法插入mysql数据库的php验证密码&#xff1f;例如,如果我手动在表中插入用户数据,请假设用户表,如下所示&#xff1a;INSERT INTO users (email, pswd) VALUES (demoexample.com, SHA1(pass123));让我们假设mysql数据库中的哈希密码是&#xff1a;--…

(转)非极大抑制(Non-Maximum Suppression)

转载自非极大抑制&#xff08;Non-Maximum Suppression&#xff09;。 参考文章&#xff1a; 1. Non-Maximum Suppression for Object Detection in Python 2. NMS非极大值抑制 最近在做人脸识别的项目&#xff0c;其中在人脸检测算法中MTCNN算法是用到了NMS算法来筛选候选…

安装配置Eclipse开发PHP环境配置

文章结束给大家来个程序员笑话&#xff1a;[M] Eclipse发开PHP环境配置 首先准备好件软&#xff1a; 1. Apache,到这里找个最新本版 2. PHP&#xff0c;到这里下载 3. Eclipse IDE for Java EE Developers&#xff0c;到这里下载 4. DLTK Core Frameworks 1.0 Integration buil…

C++ 输入一行未知个数的整数

最近笔试的时候&#xff0c;编程题遇到这样要求的输入&#xff0c;需要输入一行整数&#xff0c;个数未知&#xff0c;然后整数之间用空格间隔&#xff0c;如下所示&#xff1a; 11 22 333 45 62 代码如下所示&#xff1a; int main() {vector<int> inputs;int n 0, …

mysql5.7.20中文,ubuntu16.04 mysql5.7.20表中插入中文顯示???的解決方法

打開配置文件&#xff1a;sudo gedit /etc/mysql/my.cnf在最下面添加&#xff1a;[client]default-character-setutf8[mysqld]character-set-serverutf8[mysql]default-character-setutf8保存暫停mysql服務&#xff1a;sudo /etc/init.d/mysql stop重啟mysql服務&#xff1a;su…

[原]好玩的Linux,关于时间cal命令

我们都知道&#xff0c;在Linux中&#xff0c;可以通过cal命令来查看日历。Cal怎么用呢&#xff0c;我们可以man一下&#xff0c;可以看到如下结果&#xff1a; 我们可以看到cal命令的基本用法如下&#xff1a;cal [-smjy13] [[[day] month] year] 当然如果不加指定参数的话&a…

python appium自动化测试平台开发,Python+Appium实现自动化测试

一、环境准备1.脚本语言&#xff1a;Python3.x IDE&#xff1a;安装Pycharm2.安装Java JDK 、Android SDK3.adb环境&#xff0c;path添加E:\Software\Android_SDK\platform-tools4.安装Appium for windows&#xff0c;官网地址http://appium.io/点击下载按钮会到GitHub的下载…

基于CNN的增量学习论文的读后感

最近在阅读几篇基于CNN的增量学习的论文。 《INCREMENTAL LEARNING WITH PRE-TRAINED CONVOLUTIONAL NEURAL NETWORKS AND BINARY ASSOCIATIVE MEMORIES》 09-19 阅读 第一篇论文是《INCREMENTAL LEARNING WITH PRE-TRAINED CONVOLUTIONAL NEURAL NETWORKS AND BINARY ASSOC…

Chrome浏览器兼容性 检测工具 (chrome插件)

近日 Google Chrome 组发起了浏览器兼容性检测工具(Chrome扩展)开源项目&#xff0c;能够自动检测网页中的兼容性问题。此工具已经实现了检测2010年9月Google在 Devfest北京会议上推出的w3help.org站点内所描述的部分兼容性问题。是前端兼容性工作必备辅助开发工具。 目前的版本…

卷积神经网络(CNN)介绍

简单介绍和总结卷积神经网络&#xff08;Convolutional Neural Networks&#xff09;的基本组成网络层和常用的网络结构。 参考文章/书籍&#xff1a; An Intuitive Explanation of Convolutional Neural Networks对CNN中pooling的理解《深度学习轻松学&#xff1a;核心算法与…

CC2540低功耗的内幕

一、概述 1、BLE蓝牙协议栈结构 附图6 BLE蓝牙协议栈结构图 分为两部分&#xff1a;控制器和主机。对于4.0以前的蓝牙&#xff0c;这两部分是分开的。所有profile&#xff08;姑且称为剧本吧&#xff0c;用来定义设备或组件的角色&#xff09;和应用都建构在GAP或GATT之上。下面…