rpclib是一个 C++的 RPC 库,基于 MessagePack 进行二进制序列化和反序列化,底层使用 TCP 进行进程间通信。其功能与 Facebook 的 Thrift、Google 的 Protocol Buffers 相似,但 rpclib 更加轻量级,不需要依赖 Boost,而且不用声明接口描述文件。

rpclib 官网:

https://github.com/rpclib/rpclib

1. 编译

使用 CMake 生成对应编译系统的项目文件,编译即可,也可以使用 vcpkg 进行安装,如:

1
vcpkg install rpclib:x86-windows-static

2. 简单应用

rpclib 有服务端和客户端概念,只能由客户端调用服务端,接受服务端的返回值,服务端不能主动调用客户端函数。如需实现两端双向调用,则需要在两端分别启动一个服务端和客户端,并彼此相连。

rpclib 库的错误是通过 C++异常抛出的,因此在使用该库时需要使用 try...catch 进行异常捕获。

2.1 服务端

在服务端完成端口监听,及函数的绑定操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include "rpc/server.h"

try {
std::shared_ptr<rpc::server> rpcServer =
std::make_shared<rpc::server>("0.0.0.0", 8001); // 8001为监听端口

// 绑定Add函数,供客户端调用
rpcServer->bind("Add", [](int x, int y) -> int {
return x + y;
});

rpcServer->async_run(); // 异步启动Server循环,也可以使用run()同步启动
}
catch(std::exception& e) {
// ...
}

2.2 客户端

客户端通过 IP 和端口连接服务端,并调用服务端的函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "rpc/client.h"

try {
std::shared_ptr<rpc::client> rpcClient =
std::make_shared<rpc::client>("127.0.0.1", 8001); // 服务端监听端口

rpcClient->set_timeout(200); // 设置同步调用的超时时间

int result = rpcClient->call("Add", 100, 200).as<int>(); // 调用Add函数,参数为100,200
// result为Add函数的返回值
}
catch(std::exception& e) {
// ...
}

2.3 支持的参数和返回值类型

rpclib 使用 MessagePack 进行序列化,支持的数据类型与 MessagePack 相同。
支持如下 C++类型:

  • bool
  • char*
  • double
  • float
  • char,不支持 wchar_t
  • short
  • int
  • long
  • long long
  • std::string,不支持 std::wstring
  • std::vector
  • std::array
  • std::map
  • std::shared_ptr
  • std::unique_ptr

3. 广告

在这里推荐我的veigar框架,一个基于共享内存的rpc框架,与rpclib相比有如下的优势:

  • 没有服务端和客户端的概念,每个Veigar实例间都可以相互调用。

  • 没有网络问题,如端口占用、半关闭状态等。

  • 没有诡异的端口假可用性问题(特别是在Windows系统上)。