C++ RPC(远程过程调用)

目的

最近由于摩尔定律已经不太适用,随着大数据、计算量不断增加,导致单机处理能力不能满足需求,所以需要分布式计算,这就需要RPC(远程过程调用),下面简单介绍一下这个demo,来自于GitHub上的一个项目
csdn源码下载

client代码

#include <string>
#include <iostream>
#include <ctime>
#include "buttonrpc.hpp"

#ifdef _WIN32
#include <Windows.h>  // use sleep
#else
 #include <unistd.h>
#endif


#define buttont_assert(exp) { \
	if (!(exp)) {\
		std::cout << "ERROR: "; \
		std::cout << "function: " << __FUNCTION__  << ", line: " <<  __LINE__ << std::endl; \
		system("pause"); \
	}\
}\


struct PersonInfo
{
	int age;
	std::string name;
	float height;

	// must implement
	friend Serializer& operator >> (Serializer& in, PersonInfo& d) {
		in >> d.age >> d.name >> d.height;
		return in;
	}
	friend Serializer& operator << (Serializer& out, PersonInfo d) {
		out << d.age << d.name << d.height;
		return out;
	}
};

int main()
{
	buttonrpc client;
	client.as_client("127.0.0.1", 5555);
	client.set_timeout(2000);

	int callcnt = 0;
	while (1){
		std::cout << "current call count: " << ++callcnt << std::endl;

		client.call<void>("foo_1");

		client.call<void>("foo_2", 10);

		int foo3r = client.call<int>("foo_3", 10).val();
		buttont_assert(foo3r == 100);

		int foo4r = client.call<int>("foo_4", 10, "buttonrpc", 100, (float)10.8).val();
		buttont_assert(foo4r == 1000);

		PersonInfo  dd = { 10, "buttonrpc", 170 };
		dd = client.call<PersonInfo>("foo_5", dd, 120).val();
		buttont_assert(dd.age == 20);
		buttont_assert(dd.name == "buttonrpc is good");
		buttont_assert(dd.height == 180);

		int foo6r = client.call<int>("foo_6", 10, "buttonrpc", 100).val();
		buttont_assert(foo6r == 1000);

		buttonrpc::value_t<void> xx = client.call<void>("foo_7", 666);
		buttont_assert(!xx.valid());
#ifdef _WIN32
		Sleep(1000);
#else
        sleep(1);
#endif
	}

	return 0;
}

server代码

#include <string>
#include <iostream>
#include "buttonrpc.hpp"


#define buttont_assert(exp) { \
	if (!(exp)) {\
		std::cout << "ERROR: "; \
		std::cout << "function: " << __FUNCTION__  << ", line: " <<  __LINE__ << std::endl; \
		system("pause"); \
	}\
}\


// 测试例子
void foo_1() {
	std::cout << "foo_1()" << std::endl;
}

void foo_2(int arg1) {
	buttont_assert(arg1 == 10);
	std::cout << "foo_2(int arg1)" << std::endl;
}

int foo_3(int arg1) {
	buttont_assert(arg1 == 10);
	std::cout << "foo_3(int arg1)" << std::endl;
	return arg1 * arg1;
}

int foo_4(int arg1, std::string arg2, int arg3, float arg4) {
	buttont_assert(arg1 == 10);
	buttont_assert(arg2 == "buttonrpc");
	buttont_assert(arg3 == 100);
	buttont_assert((arg4 > 10.0) && (arg4 < 11.0));

	std::cout << "foo_4(int arg1, std::string arg2, int arg3, float arg4)" << std::endl;
	return arg1 * arg3;
}

class ClassMem
{
public:
	int bar(int arg1, std::string arg2, int arg3) {
		buttont_assert(arg1 == 10);
		buttont_assert(arg2 == "buttonrpc");
		buttont_assert(arg3 == 100);

		std::cout << "bar(int arg1, std::string arg2, int arg3)" << std::endl;

		return arg1 * arg3;
	}
};

struct PersonInfo
{
	int age;
	std::string name;
	float height;

	// must implement
	friend Serializer& operator >> (Serializer& in, PersonInfo& d) {
		in >> d.age >> d.name >> d.height;
		return in;
	}
	friend Serializer& operator << (Serializer& out, PersonInfo d) {
		out << d.age << d.name << d.height;
		return out;
	}
};

PersonInfo foo_5(PersonInfo d,  int weigth)
{
	buttont_assert(d.age == 10);
	buttont_assert(d.name == "buttonrpc");
	buttont_assert(d.height == 170);

	PersonInfo ret;
	ret.age = d.age + 10;
	ret.name = d.name + " is good";
	ret.height = d.height + 10;

	std::cout << "foo_5(PersonInfo d,  int weigth)" << std::endl;

	return ret;
}

int main()
{
	buttonrpc server;
	server.as_server(5555);

	server.bind("foo_1", foo_1);
	server.bind("foo_2", foo_2);
	server.bind("foo_3", std::function<int(int)>(foo_3));
	server.bind("foo_4", foo_4);
	server.bind("foo_5", foo_5);

	ClassMem s;
	server.bind("foo_6", &ClassMem::bar, &s);

	std::cout << "run rpc server on: " << 5555 << std::endl;
	server.run();

	return 0;
}

下载源码后,适用vs2015编译就可以使用了。

  • 7
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
### 回答1: 编译buttonrpc需要按照以下步骤进行: 1. 首先,确保已经安装了必要的依赖项。通常,编译buttonrpc需要安装CMake和GCC等工具。可以通过在终端中运行以下命令来检查它们是否已安装: ``` cmake --version gcc --version ``` 如果命令返回版本信息,则表示已安装。 2. 下载buttonrpc的源代码。可以从github等平台上找到buttonrpc的源代码,也可以直接从官方网站上下载。下载完成后,将源代码解压到一个合适的目录。 3. 进入解压后的源代码目录。在终端中使用``cd``命令切换到同级目录。 4. 创建一个新的构建目录。为了保持源代码结构的干净,可以在源代码目录之外创建一个新的目录来保存构建文件。例如,可以执行以下命令创建一个名为``build``的目录: ``` mkdir build cd build ``` 5. 生成构建文件。使用CMake生成构建文件,用于在目标平台上编译buttonrpc。在构建目录中执行以下命令: ``` cmake .. ``` CMake将根据源代码中的CMakeLists.txt文件生成相应的构建文件。 6. 编译buttonrpc。在构建目录中执行以下命令: ``` make ``` 这将使用GCC等工具编译并生成buttonrpc可执行文件。 7. 完成编译。一旦编译完成,可以在构建目录中找到生成的可执行文件。你可以将其复制到其他目录中,并按照需要进行使用。 注意:在编译按钮RPC之前,确保已经安装了所有必要的依赖项,并且已经按照上述步骤正确配置了编译环境。 ### 回答2: 要将buttonrpc编译为Linux可执行程序,可以按照以下步骤进行操作: 1. 首先,在Linux系统上安装必要的编译工具。常见的编译工具包括gcc、g++、make等。可以使用系统的包管理器来安装这些工具,例如在Ubuntu上可以使用以下命令安装: ``` sudo apt-get install build-essential ``` 2. 下载buttonrpc的源代码。可以从官方网站或者GitHub上获取最新的源代码。 3. 解压源代码文件。可以使用以下命令解压: ``` tar -xvf buttonrpc.tar.gz ``` 4. 进入解压后的源代码目录。可以使用以下命令进入目录: ``` cd buttonrpc ``` 5. 确保源代码目录中包含一个名为Makefile的文件。这个文件描述了编译过程的规则和命令。 6. 在终端中执行make命令,开始编译。 ``` make ``` 7. 等待编译完成。编译过程可能会花费一些时间,具体时间取决于项目的规模和系统性能。 8. 编译完成后,将生成一个名为buttonrpc的可执行文件。可以通过以下命令运行该文件: ``` ./buttonrpc ``` 以上就是在Linux系统上编译buttonrpc的大致步骤。根据具体的编译环境和依赖关系,可能需要做一些额外的配置和调整。 ### 回答3: 编译buttonrpc可以按照以下步骤进行: 1. 首先,确保你的系统上已经安装了必要的编译工具,比如gcc、g++、cmake等。你可以使用以下命令检查: ``` gcc -v g++ -v cmake --version ``` 2. 在你的计算机上下载buttonrpc的源代码,可以通过Git仓库或者下载压缩包的方式获取。 3. 进入buttonrpc源代码的根目录,创建一个新的构建目录,并进入该目录: ``` mkdir build cd build ``` 4. 使用CMake来配置编译过程,你可以根据你的需求修改CMake配置参数,比如指定生成的目标平台、编译模式等。下面是一个示例的配置命令: ``` cmake .. ``` 5. 执行配置命令后,CMake将生成Makefile文件,你可以使用make命令进行编译。在执行make之前,你可以选择指定并发编译的线程数,以加快编译速度。比如使用4个线程: ``` make -j4 ``` 6. 编译完成后,你会在构建目录中找到生成的可执行文件。可以使用以下命令运行buttonrpc: ``` ./buttonrpc ``` 以上就是在Linux上编译并运行buttonrpc的一般步骤。请注意,具体的步骤可能会因为你的环境和需求的不同而有所调整。在实际操作中,你可能还需要根据需要添加额外的依赖和配置。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值