利用thrift rpc进行C++与Go的通信

一:什么是rpc

rpc通俗来理解就是远程调用函数,相对于本地调用来说,只需要在主调函数中调用被掉函数即可,代码如下:

 1 void fun(int i)
 2 {
 3     cout << "function call" << endl;
 4     cout << "args: " << i << endl;
 5     return;
 6 }
 7
 8 int main()
 9 {
10     fun(5);
11     return 0;
12 }

在上面的代码中,main( )函数在第10行调用了本地函数fun( ),本地调用就是这么简单。如果要远程调用一个函数,那么就需要进行网络通信,网络通信就设计到了网络编程,网络编程中有一本著名的经典书籍:《UNIX网络编程》,简称UNP,这本书基本上是系统层网络编程人员必读书籍,但是读过这本书的人都知道,网络的细节很多,也较复杂,如果每个项目都需要亲自写这些底层实现,那无疑大大延缓了项目开发进度,而且很多上层开发人员不懂得这些细节。解决办法就是造轮子,以库的形式封装这些底层细节,屏蔽掉底层,让其他开发人员可以简单直接使用。

二:thrift的安装

thrift就是前面提到的一种rpc库。,它是跨语言的,并且是C/S模式。

三:利用thrift进行C++与Go通信

C++服务端:

// This autogenerated skeleton file illustrates how to build a server.
// You should copy it to another filename to avoid overwriting it.

// system
#include <time.h>
#include <unistd.h>

// lib
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/server/TSimpleServer.h>
#include <thrift/transport/TServerSocket.h>
#include <thrift/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;

// project
#include "/home/archer/develop/thrift/gen-cpp/timeServe.h"
using namespace utilityOfTime;

class timeServeHandler : virtual public timeServeIf {
public:
    timeServeHandler() {
        // Your initialization goes here
    }

    int32_t getCurrtentTime() {
        // Your implementation goes here
        printf("getCurrtentTime\n");
        sleep(1);
        return time(nullptr);
    }

};

int main() {
    int port = 9090;
    shared_ptr<timeServeHandler>  handler(new timeServeHandler());
    shared_ptr<TProcessor>        processor(new timeServeProcessor(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;
}

C++客户端:

// system
#include <iostream>

// lib
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/transport/TSocket.h>
#include <thrift/transport/TTransportUtils.h>
using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;
using boost::shared_ptr;

// project
#include "timeServe.h"
using namespace utilityOfTime;

int main() {
    // get socket
    shared_ptr<TTransport> socket(new TSocket("127.0.0.1", 9090));

    // choose transport
    shared_ptr<TTransport> transport(new TBufferedTransport(socket));

    // serialize
    shared_ptr<TProtocol>  protocol(new TBinaryProtocol(transport));

    timeServeClient client(protocol);

    // open connect
    transport->open();
    auto timeNow = client.getCurrtentTime();
    std::cout << timeNow << std::endl;
    transport->close();

    return 0;
}

Golang客户端:

package main

import (
	"fmt"
	"git.apache.org/thrift.git/lib/go/thrift"
	"os"
	"timeserve"
)

func main() {
	// get socket
	socket, err := thrift.NewTSocket("127.0.0.1:9090")

	// choose transport
	transport := thrift.NewTBufferedTransport(socket, 8192)

	// serialize
	protocolFactory := thrift.NewTBinaryProtocolFactoryDefault()

	client := timeserve.NewTimeServeClientFactory(transport, protocolFactory)

	// open connect
	transport.Open()
	defer socket.Close()

	timeResult, err := client.GetCurrtentTime()
	if err != nil {
		fmt.Println(err.Error())
		os.Exit(2)
	}
	fmt.Println(timeResult)

}

  

时间: 2024-10-13 00:07:59

利用thrift rpc进行C++与Go的通信的相关文章

Thrift 个人实战--Thrift RPC服务框架日志的优化

前言: Thrift作为Facebook开源的RPC框架, 通过IDL中间语言, 并借助代码生成引擎生成各种主流语言的rpc框架服务端/客户端代码. 不过Thrift的实现, 简单使用离实际生产环境还是有一定距离, 本系列将对Thrift作代码解读和框架扩充, 使得它更加贴近生产环境. 本文讲述RPC服务框架中, 日志的重要性, 以及logid的引入. 日志不仅包含丰富的数据(就看是否会挖掘), 而且还是线上服务问题追踪和排查错误最好的方式. 日志级别 采用大家喜闻乐见的log4j作为该RPC服

hbase之python利用thrift操作hbase数据和shell操作

前沿: 以前都是用mongodb的,但是量大了,mongodb显得不那么靠谱,改成hbase撑起一个量级. HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列的存储模型.它存储的是松散型数据. HBase提供了丰富的访问接口. HBase Shell Java clietn API Jython.Groovy DSL.Scala REST Thrift(Ruby.Pyt

Thrift RPC实战(三) thrift序列化揭秘

本文主要讲解Thrift的序列化机制, 看看thrift作为数据交换格式是如何工作的? 1.构造应用场景: 1). 首先我们先来定义下thrift的简单结构. 1 2 3 4 5 namespace java com.yangyang.thrift.api struct Pair { ? ? 1: required string key ? ? 2: required string value } required修饰符你肯定能猜测到它的意义, 但是你是否有没有这样的疑惑, "1",

利用DNode实现php和nodejs之间的通信

一,安装DNode, 1, for nodejs, 执行 $ sudo npm install dnode 2, for php, 利用composer来安装DNode php 执行下列语句下载composer $ wget http://getcomposer.org/composer.phar 创建一个文件composer.json,然后填入如下语句, {     "require": {         "dnode/dnode": "0.2.0&q

[HTML5_WebWorkers]利用HTML5的window.postMessage实现跨域通信

由于同源策略的限制,JavaScript跨域的问题,一直是一个颇为棘手的问题,为了解决js的跨域,web开发人员是煞费苦心,研究了各种跨域方案,如果有机会的话,明河以后会一一展示给各位,今天明河重点介绍下html5新引入的postMessage跨域方案. 1.哪些场景要考虑跨域问题? 明河这二周在处理淘宝添加收藏夹的重构,里面就有一个非常经典的跨域问题.添加收藏弹出层外层是淘宝商城页面域名是tmall.com,而弹出层内部的页面域名却是taobao.com,接下来的问题就是我现在希望弹出层内部的

利用接口回调实现fragment与activity的通信

Fragment 与activity相互传递数据,可按如下方式进行: 1.Activity 向Fragment传递数据:在Activity中创建Bundle数据包(如果传输涉及对象,要实现对象的系列化),并调用Fragment的setArguments(Bundle      bundle)方法即可实现将Bundle数据包传给Fragment,这个很容易实现. 2.但是如果反过来呢,单我们点击触发Fragment的事件时,希望将数据返回Activity,Activity获得数据进行之后的操作,也

Vue中利用$emit实现子组件向父组件通信

Vue中利用$emit实现子组件向父组件通信 父组件 <template> <div> <p>我是父组件</p> <child :isShow="show" @hidechild="hidechild"></child> <button @click="show=true">显示子组件</button> </div> </templa

使用Thrift RPC编写程序(服务端和客户端)

1. Thrift类介绍 Thrift代码包(位于thrift-0.6.1/lib/cpp/src)有以下几个目录: concurrency:并发和时钟管理方面的库processor:Processor相关类protocal:Protocal相关类transport:transport相关类server:server相关类 1.1 Transport类(how is transmitted?)负责数据传输,有以下几个可用类:TFileTransport:文件(日志)传输类,允许client将文件

Thrift RPC的一个简单c++ demo

Thrift是一种开源的跨语言的RPC服务框架,最初由facebook公司开发的,在2007年facebook将其提交apache基金会开源了.对于当时的facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传输通信以及系统之间语言环境不同需要跨平台的特性. 首先需要定义.thrift接口文件: namespace cpp project struct CompanyInfo{ 1: i32 id; 2: string name; 3: string desc;