thrift初体验

RPC框架Thrift初体验 最近项目遇到 需要C#和java通讯,java远程调用C#程序提供的服务,引入了thrift跨语言通讯框架,在网上找到了实践教程,于是手动做了一遍,成功运行后在此做记录。 1、首先需要下载thrift编译工具,我本地下载版本是thrift-0.12.0 2、编写thrift文件,定义服务:新建文本文件保存为.thrift文件 service HelloWorldBidirectionService { void SayHello(1:string msg); } 3、使用thrift 阅读详情

使用thrift实现java调用c++实现的简单webservice

 

首先是安装thrift,这花费了不少时间。

关于安装步骤,apache的官方说明已经比较详细了:

 

http://wiki.apache.org/thrift/ThriftRequirements

http://wiki.apache.org/thrift/ThriftInstallation

 

看起来依赖的库很多,但其实关键的也就是

boost

ant

ivy

slf4j

byacc

 

(安装的具体依赖关系需要继续验证)

 

1.首先需要定义一个service,也就是新建一个.thrift文件。

在任意位置创建一个文件夹作为项目目录,下面到操作如无说明均是在此目录下进行。

让我们来创建一个.thrift文件吧:

文件名:jobsm.thrift

文件内容:

 

struct JobInfo {

  1: i32 jobid = 0,

  2: string user,

}

 

service JobScheduler{

 

   void ping(),

 

   bool addJob(1:JobInfo job),

 

   JobInfo getJob()

}

 

 

2.使用c++构建server端:

通过thrift命令生成cpp代码:

$ thrift -r --gen cpp jobsm.thrift

成功后我们会见到生成的gen-cpp文件夹,进入gen-cpp/,可以看到很多自动生成的c++源文件,创建我们自己的server代码:

文件名:

JobScheduler_server.cpp

文件内容:

// This autogenerated skeleton file illustrates how to build a server.

// You should copy it to another filename to avoid overwriting it.

 

#include <iostream>

#include <queue>

 

#include "JobScheduler.h"

#include <protocol/TBinaryProtocol.h>

#include <server/TSimpleServer.h>

#include <transport/TServerSocket.h>

#include <transport/TBufferTransports.h>

 

using namespace ::apache::thrift;

using namespace ::apache::thrift::protocol;

using namespace ::apache::thrift::transport;

using namespace ::apache::thrift::server;

 

using boost::shared_ptr;

 

class JobSchedulerHandler : virtual public JobSchedulerIf {

 

 private:

  std::queue<JobInfo> container;

 

 public:

  JobSchedulerHandler() : container() {

    // Your initialization goes here

  }

 

  void ping() {

    // Your implementation goes here

    printf("run ping/n");

  }

 

  bool addJob(const JobInfo& job) {

    // Your implementation goes here

    std::cout<<"add job's id is "<<job.jobid<<std::endl;

    std::cout<<"add job's user is "<<job.user<<std::endl;

    container.push(job);

    printf("run addJob/n");

  }

 

  void getJob(JobInfo& _return) {

    // Your implementation goes here

    _return = container.front();

    container.pop();

    std::cout<<"pop job's id is "<<_return.jobid<<std::endl;

    std::cout<<"pop job's user is "<<_return.user<<std::endl;

    printf("run getJob/n");

  }

 

};

 

int main(int argc, char **argv) {

  int port = 9090;

  shared_ptr<JobSchedulerHandler> handler(new JobSchedulerHandler());

  shared_ptr<TProcessor> processor(new JobSchedulerProcessor(handler));

  shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));

  shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());

  shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());

 

  TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);

  server.serve();

  return 0;

}

然后写一个简单的makefile:
BOOST_DIR = /usr/local/boost/include/boost-1_33_1/
THRIFT_DIR = /usr/local/include/thrift
LIB_DIR = /usr/local/lib
GEN_SRC = ./jobsm_types.cpp ./JobScheduler.cpp
default: server
server: JobScheduler_server.cpp
g++ -o CppServer -I${THRIFT_DIR} -I${BOOST_DIR}  -I../gen-cpp -L${LIB_DIR} -lthrift JobScheduler_server.cpp ${GEN_SRC}
clean:
$(RM) -r CppServer
make成功后,可以看到可执行文件CppServer。
$ ./CppServer 后服务就算是启动了。
3.使用java构建客户端
类似的,使用thrift命令生成java代码

$ thrift -r --gen java jobsm.thrift

成功后我们会见到生成的gen-java文件夹,进入gen-java/,可以看到很多自动生成的java文件,创建我们自己的client代码:

文件名:JavaClient.java

文件内容:

import org.apache.thrift.TException;

import org.apache.thrift.transport.TTransport;

import org.apache.thrift.transport.TSocket;

import org.apache.thrift.transport.TTransportException;

import org.apache.thrift.protocol.TBinaryProtocol;

import org.apache.thrift.protocol.TProtocol;

 

import java.util.AbstractMap;

import java.util.HashMap;

import java.util.HashSet;

import java.util.ArrayList;

 

public class JavaClient {

  public static void main(String [] args) {

 

    try{

      TTransport transport = new TSocket("localhost", 9090);

      TProtocol protocol = new TBinaryProtocol(transport);

      JobScheduler.Client client = new JobScheduler.Client(protocol);

 

      transport.open();

 

      for(int i=0; i<args.length; i++) {

        System.out.println(args[i]);

      }

 

      client.ping();

      System.out.println("ping()");

 

      JobInfo job = new JobInfo();

      if(args.length > 0 && args[0] != null)

       job.setJobid(Integer.parseInt(args[0]));

      else

        job.setJobid(0);

      if(args.length >1 && args[1] != null)

        job.setUser(args[1]);

      else

        job.setUser("default");

 

      client.addJob(job);

      System.out.println("addJob");

 

      JobInfo job2 = client.getJob();

      System.out.println("getJob. JobId is "+ job2.getJobid() + ". JobUser is " + job2.getUser());

 

    } catch (TException x) {

      x.printStackTrace();

    }

  }

}

 

让我们使用ant来编译这个java工程吧,在gen-java目录下新建一个build.xml文件

文件内容:

<project name="jobscheduler" default="jobscheduler" basedir=".">

 

  <description>JobScheduler</description>

 

  <property name="src" location="./" />

  <property name="gen" location="./" />

  <property name="build" location="build" />

 

  <path id="libs.classpath">

    <pathelement path="/usr/thrift-0.5.0/lib/java/libthrift.jar" />

    <fileset dir="/usr/thrift-0.5.0/lib/java/build/ivy/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="jobscheduler" depends="compile">

    <jar jarfile="jobscheduler.jar" basedir="${build}"/>

  </target>

 

  <target name="clean">

    <delete dir="${build}" />

    <delete file="jobscheduler.jar" />

  </target>

 

</project>

 

好了,执行 $ ant

成功后就生成了build目录和一个新的jar包,再写一个shell来运行客户端吧。

文件名:JavaClient

文件内容:

#!/bin/sh

 

LIB_DIR=/usr/thrift-0.5.0/lib/java/

IVY_DIR=$LIB_DIR/build/ivy/lib/

java -cp $IVY_DIR/*:$LIB_DIR/libthrift.jar:jobscheduler.jar JavaClient $1 $2

 

运行客户端:

$ ./JavaClient 123 userABC

可以看到server端和client端都有对应的显示。

说明一个简单的webservice成功完成!

 

【Thrift入门】QT实现Thrift C++服务端和客户端 效果示例 本文为了测试和显示方便,将Thrift客户端和服务端编写在同一QT程序中,分别开启一个线程进行交互。 测试操作: 点击“开启服务”,开启Thrift服务端的监听;在“测试数据”的输入框中输入测试消息,点击“请求服务”发送给服务端进行处理;并把服务端的返回结果显示在“返回结果”的输出框中。 QT调用Thrift库 编译VS2015 x64版本的Thrift静态库,并在QT工程的.pro文... 阅读详情

相关推荐

Thrift介绍以及Java中使用Thrift实现RPC示例

场景 Thrift Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++, Java, Python,PHP, Ruby, Erlang,Perl,Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml都支持。 Thrift是一个典型的CS(客户端/服务端)结构,客户端和服务端可以使用不同的语言开发。既然客户端和服务端能使用不同的语言开发,那么一定就要有一种中间语言来关联客户端和服

BADAO_LIUMANG_QIZHI的博客 5025

Thrift

服务的定义方法在语义上等同于面向对象语言中的接口。编译后的Java代码// ... 省略很多代码。

qq_62368250的博客 1810

HBase thrift2

一、简介 Thrift server是HBase中的一种服务,主要用于对多语言API的支持。基于Apache Thrift(多语言支持的通信框架)开发,目前有两种版本thrift和thrift2。 thrift2是当时为了适应新的Java API,提出来的。由于种种原因,thrift2没有完美兼容并替代thrift,所有就留下了两个版本。 Thrift2没有DDL方面的接口,所以现在Hue还是用T...

bingoabin 3130

Linux 使用thrift进行java和c++之间调用

项目需要,文件拼接检查这块使用的c语言完成的,项目是java的项目,考虑过jni调用,但存在c代码异常导致jvm崩溃问题,故采用thrift进行调用,保证java项目运行稳定,执行 thrift --gen cpp FileConcat.thrift,执行完成后生成gen-cpp目录,里面有几个.cpp和.h文件,我这不的机器上thrift版本。首先是执行thrift --gen java FileConcat.thrift,执行完后产生gen-java目录,里面有三个java文件,复制到项目中。

xuyun0565的专栏 407

thrift 架构的Java的小例子 demo

此文件为自己在Mac电脑上写的thrift的demo,使用maven 管理了小程序,并用thrift生成了源码,其中对thrift生成的源码,把override注销了,其他的没处理,如果感兴趣参考博客:https://www.cnblogs.com/aspirant/p/9391714.html

thrift框架示例

thrift框架示例,thrift框架客户端代码。 开发平台MyEclipse 9

Thrift框架入门(Java)

定义 Thrift框架是什么? 答:thrift是二进制的高性能的通讯中间件,支持数据(对象)序列化和多种类型的RPC服务。 Thrift框架解决了什么问题? 答:它提供了一套解决方案,可以解决各系统间大数据量的传输通信以及系统之间语言环境不同,需要跨平台的问题。 Thrift的特点是什么? 答: Thrift是一个服务端和客户端的架构体系;需要你在系统中搭建好通信双方的接口逻辑。 Thrift 具有自己内部定义的传输协议规范(TProtocol)和传输数据标准(TTransports), Thrif

qq_42031483的博客 3575

微型纵向加密在新能源场站中的实战部署与运维避坑指南

本文详细解析了微型纵向加密在新能源场站中的实战部署与运维技巧。通过国密算法SM4实现数据加密,确保新能源场站通信安全,同时提供非侵入式部署方案和运维避坑指南,帮助提升网络稳定性和运维效率。

weixin_30505225的博客 598

go Thrift初体验(win10+普通网络)

之前写过一篇go gRPC初体验(win10+普通网络),今天写个姊妹篇,说一说thrift。 thrift和gprc呢,使用都很广泛,以我现在的水平还无法评价孰好孰坏,反正实习的时候我看的程序里,grpc和thrift都有出现,所以说都学习一下,是最保险的。 为什么我先写的grpc呢,因为grpc的官方文档有中文版,凡是先挑简单的做嘛,而thrift,我查了查,好像并没有中文文档,网上虽然也...

djqueen的博客 1880

Comsol实战:铌酸锂x切与z切参数设置全攻略(附电场强度归一化技巧)

本文详细介绍了在Comsol Multiphysics中设置铌酸锂x切与z切晶体参数的全流程,包括晶体取向定义、电光系数配置及关键光学参数计算。重点讲解了电场强度归一化这一实用技巧,帮助用户提升仿真分析效率,为设计电光调制器等集成光子器件提供精准的仿真基础。

year5的博客 583

【Audio driver】深入解析mixer_paths.xml中的音频通路配置

本文深入解析了Android音频驱动开发中的核心配置文件mixer_paths.xml。文章以高通平台为例,详细阐述了音频通路(FE、BE、DSP、Device)的概念与连接逻辑,并通过实战案例拆解了扬声器与麦克风通路的配置方法、关键控件作用及调试技巧,是理解与定制Android音频系统的实用指南。

ik6789012的博客 358

RPC框架初体验之Thrift

RPC框架初体验之Thrift 版本说明:thrfit 0.12.0 模块说明: thrift-demo-java-api: 使用thrift生成Java api thrift-demo-java-server: Java 实现Thrift服务端 thrift-demo-java-client:Java实现Thrift客户端 thrift-demo-py-api:使用thrift生成Pyth...

shirukai 747

5张图,搞懂三方支付机构的“备付金账户”体系

本文将详细解析第三方支付机构各类备付金账户的功能定位、所承载的支付业务处理流程以及日常管理。

银行信息系统应用架构详解 2146

Apache Thrift 基础&初体验

简介: Thrift最初由FaceBook研发,主要用于各个服务之间的RPC通信,支持跨语言,Thrift是一个典型的CS(客户端、服务端)结构,客户端和服务端可以是用不同的语言开发,既然客户端和服务端能用不同的语言开发,那么一定是要有一种中间语言来关联客户端和服务端语言,这种语言就是IDL(interface Description Language) 工作原理: 数据传输使用socket...

qq_27820551的博客 353

深入GD32/STM32引脚复用:你的JTAG/SWD接口是怎么‘消失’的?一次讲清原理与预防

本文深入解析GD32/STM32调试接口(JTAG/SWD)突然失效的原理与预防措施。通过分析MCU启动流程、引脚复用机制及典型错误代码模式,揭示调试接口'消失'的根本原因,并提供硬件设计检查清单、软件防护代码及开发流程优化方案,帮助开发者有效避免烧录失败问题。

weixin_42532938的博客 369

STM32+OpenCV云台PID调参实战:从震荡到丝滑跟踪的进阶之路

本文详细介绍了基于STM32和OpenCV的跟踪云台PID调参实战经验。从硬件搭建、PID控制原理到调参技巧,系统讲解了如何通过调整比例、积分和微分参数解决系统震荡问题,实现从震荡到丝滑跟踪的进阶过程,特别适合电赛和嵌入式视觉控制开发者参考。

tgb3456789的博客 717

server如何调用 thrift_RPC框架探索:Thrift初体验

概述Thirft是一个轻量级的RPC框架,现在还是0.13版本,算起来比较年轻了。但该有的都有,他也定义了IDL语言,使用thrift编译生成各个编程语言的接口定义。Thirft官方强调的也是跨语言环境基于IDEA、maven来构建。相关环境如下:Thrift的一种开发环境配置总体来说,Thrift上手很快。但是有一些潜在的点,可能会造成一些歧义:IDL定义语言Thrift,需要掌握。这里有一些约...

weixin_34487308的博客 180

LeRobot 入门教程(十四)Meta-World 机器人多任务与元强化学习操作仿真基准平台

Meta-World是一个开源机器人操作模拟基准平台,专注于多任务与元强化学习研究。该平台提供50项多样化任务(MT50套件),采用标准化评估协议测试算法泛化能力。LeRobot平台支持Meta-World任务评估,提供预处理数据集和训练工具。用户可通过命令行快速训练SmolVLA策略,并评估模型在简单、中等、困难等不同难度任务上的表现。文章还提供了兼容性问题和实用技巧建议,如使用完整MT50任务集测试泛化能力、采用one-hot任务条件化等。这些资源为研究人员开展机器人多任务学习提供了标准化实验环境。

2506_90492529的博客 1021

RPC 基本原理与 Apach Thrift 初体验

概述RPC(Remote Procedure Call,远程过程调用)是一个计算机通信协议,此协议允许进程间通信。简单来说,当机器 A 上的进程调用机器 B 上的进程时,A 上的调用进程被挂起,而 B 上的被调用进程开始执行。调用方可以通过参数将信息传送给被调用方,然后可以通过被调用方传回的结果得到返回。RPC 框架屏蔽了底层传输方式(TCP/UDP)、序列化和反序列化(XML/JSON/二进制)等

Leo的博客 8947

新手必看!一步步教您如何获取可用的D音Cookie(为什么我复制的D音Cookie无法正常使用?)

新手必看!一步步教您如何获取可用的抖音Cookie(为什么我复制的抖音Cookie无法正常使用,无法下载无水印视频?)

XiaoqiangClub的博客 1491

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

apache thrift C++入门实践

什么是thrift? thrift是一个跨语言的RPC(远程调用)框架,它可以被用作不同语言编写的服务之间的RPC通信,它使用声明式语法,带有一个强大的代码生成引擎,使用时首先编写thrift文件进行各种变量和数据结构的声明,然后使用thrift编译器将该文件编译成指定语言,一般命令行格式为thrift.exe -r --gen [lang] source.thrift,默认会在当前目录

yuchno1的专栏 3160

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ubuntu下thrift的安装

一、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.安装其他相

小七 6307

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

从Demo理解Thrift & Thrift和Dubbo的区别

从一个小demo操作理解RPC框架Thrift,并尝试给出其和另一款RPC框架Dubbo的区别

蒋大钊的博客 1509

[thrift] thrift基本原理及使用

Thrift架构 thrift主要用于各个服务之间的RPC通信,支持跨语言。thrift是一个典型的CS结构,客户端和服务端可以使用不同的语言开发,thrift通过IDL(Interface Description Language)来关联客户端和服务端。thrift的整体架构图如下图所示 如下图所示为thrift的网络栈结构 thirft使用socket进行数据传输,数据以特定的格...

zkp_java的专栏 7万+

hbase的thrift接口(thrift与thrift2的对比)

一、概述 Hbase是目前比较火的列存储数据库,由于Hbase是用Java写的,因此它原生地提供了Java接口,对非Java程序人员,怎么办呢?幸好它提供了thrift接口服务器,因此也可以采用其他语言来编写Hbase的客户端,本文即是Hbase C++接口的介绍。 目前的Hbase(0.94.11,本文即基于此版本)有两套thrift接口(可以叫thrift1和thrift2),它们并不兼容(...

文武傲群雄,彳亍定江山 2914
上一篇: gcc STL iterator 出现错误 expected `;' before ‘iter’
下一篇: 顶级名校的教学视频
老哂
博客等级 码龄20年 27粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值