【链接】GitHub - qicosmos/rest_rpc: modern C++(C++11), simple, easy to use rpc framework

      rest_rpc是一个高性能 C++ RPC 框架,适合用C++构建高性能分布式系统,其目标是让tcp通信变得非常简单易用,即使不懂网络通信的人也可以直接使用它。

核心组件

1. RPC服务器(rpc_server.h)

  • 使用ASIO管理客户端连接

  • 通过io_service_pool实现线程池

  • 通过router类处理请求路由

  • 支持常规RPC调用和发布-订阅模式

  • 包含带超时的连接管理

  • 支持SSL/TLS加密

2. RPC客户端(rpc_client.hpp)

  • 提供同步和异步调用机制

  • 支持基于future和基于callback的异步调用

  • 实现发布-订阅功能

  • 带自动重连的连接管理

  • 包含超时机制

  • 支持SSL/TLS加密

3. 序列化与消息传递

  • 编解码器(codec.h): 使用MessagePack进行序列化

  • 协议: 自定义二进制协议,头部包含:

    • 魔数

    • 请求类型

    • 消息体长度

    • 请求ID

    • 函数ID

4. 工具类

  • 路由器(router.h): 使用MD5哈希将函数名映射到处理程序

  • 连接管理(connection.h): 处理单个客户端连接

  • 线程池(io_service_pool.h): 管理IO服务线程

  • 客户端工具(client_util.hpp): 结果处理的辅助函数

  • 元编程工具(meta_util.hpp): 模板元编程辅助

  • MD5(md5.hpp): MD5哈希实现

主要特性

  1. 协议设计:

    • 带固定长度头部的二进制协议

    • 支持请求-响应和发布-订阅模式

    • 带结果码的错误处理

  2. 性能优化:

    • 线程池实现并发请求处理

    • 全异步IO

    • 缓冲区管理减少内存分配

  3. 错误处理:

    • 全面的错误码

    • 超时机制

    • 连接错误回调

  4. 可扩展性:

    • 支持自定义序列化

    • 可插拔SSL/TLS

    • 可定制的错误处理

  5. 跨语言支持:

    • 明确的客户端语言标识

    • 对Java客户端的特殊处理

实现细节

rpc_server服务端

  • rpc_server 类依赖于 router 来进行消息路由。
  • rpc_server 创建和管理多个 connection 实例,每个实例代表一个客户端连接。
  • router 负责注册处理器,并根据请求的内容将其转发给相应的处理器。
  • connection 类提供了与单个客户端通信所需的方法,包括响应、发布消息等功能。

这种设计允许rpc_server专注于网络层和服务的生命周期管理,而具体的业务逻辑则通过在router中注册的不同处理器来实现。这样可以使得系统更加模块化,便于扩展和维护

  • 使用ASIO的io_service实现每个线程一个核心的模型

  • 维护连接状态和超时

  • 实现干净的关闭过程

  • 支持成员和非成员函数处理程序

客户端

  • 提供同步和异步API

  • 实现自动重连

  • 管理请求超时

  • 支持基于future和callback的异步模式

序列化

  • 使用MessagePack实现高效的二进制序列化

  • 处理简单和复杂类型

  • 包含反序列化的错误处理

使用模式

服务器设置

rpc_server server(9000, std::thread::hardware_concurrency());
server.register_handler("add", [](int a, int b) { return a + b; });
server.run();

客户端调用

rpc_client client("localhost", 9000);
client.connect();
int result = client.call<int>("add", 2, 3);

异步调用

auto future = client.async_call<FUTURE>("add", 2, 3);
auto result = future.get().as<int>();

发布-订阅

// 服务端
server.publish("news", "Breaking news!");

// 客户端
client.subscribe("news", [](string_view data) {
    std::cout << "Received: " << data << std::endl;
});

优势

  1. 性能: 异步设计加线程池

  2. 灵活性: 支持多种调用模式

  3. 健壮性: 全面的错误处理

  4. 可扩展性: 易于添加新功能

  5. 跨平台: 使用标准C++和ASIO

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐