shuai132 / rpc_core

a tiny rpc library, support c++14 and rust
MIT License
43 stars 4 forks source link
cpp11 cpp14 mcu rpc rpccore rust serialization

rpc_core

Build Status Build Status Release License

a tiny C++14 rpc library, supports all platforms (macOS, Linux, Windows, iOS, Android, etc.) and most microchips ( Arduino, STM32, ESP32/ESP8266, etc.)

Recommend TCP-based implementation: asio_net

Introduction

Full-feature rpc frameworks (e.g. gRPC and bRPC) are very complex and not suitable for embedded systems.

This project offers a lightweight and user-friend rpc library that is better suited for one-to-one rpc calls. It supports all platforms and a wide range of microchips, including Arduino, STM32, ESP32/ESP8266, and more.

Note: This project only offers the protocol layer and API, it does not include the implementation of the transport layer. For TCP-based implementation: asio_net

Features

TCP-based implementations

Requirements

Usage

// The Receiver
rpc->subscribe("cmd", [](const std::string& msg) -> std::string {
    assert(msg == "hello");
    return "world";
});

// The Sender
rpc->cmd("cmd")
    ->msg(std::string("hello"))
    ->rsp([](const std::string& rsp) {
      assert(rsp == "world");
    })
    ->call();
// The Receiver
rpc->subscribe("cmd", [&](request_response<std::string, std::string> rr) -> asio::awaitable<void> {
    assert(rr->req == "hello");
    asio::steady_timer timer(context);
    timer.expires_after(std::chrono::seconds(1));
    co_await timer.async_wait();
    rr->rsp("world");
}, scheduler_asio_coroutine);

// The Sender
// use C++20 co_await with asio, or you can use custom async implementation, and co_await it!
auto rsp = co_await rpc->cmd("cmd")->msg(std::string("hello"))->async_call<std::string>();
assert(rsp.data == "world");

Inspect the code for more details: rpc_s_coroutine.cpp and rpc_c_coroutine.cpp

  1. msg and rsp support any serializable type, refer to Serialization.
  2. Detailed usages and unittests can be found here: rpc_test.cpp
  3. There is an example shows custom async impl: rpc_c_coroutine.hpp

Serialization

High-performance and memory-saving binary serialization.

Why design a new serialization

Fist of all, I want to keep rpc_core library standalone, without any dependencies, except for STL.

Moreover, these serialization libraries do not align with my design goals:

Of course, when communicating across languages, it is recommended to use the above serialization libraries!

Finally, it also provides a way to use thirdparty serialization libraries directly, refer to Serialization Plugins.

Usage

For example, user data:

struct Type {
  uint8_t id = 1;
  uint8_t age = 18;
  std::string name = "test";
};

json: {"id":1,"age":18,"name":"test"}

library bytes
json 31
flatbuffers 44
protobuf 10
msgpack 8
rpc_core 8

Serialization Plugins

License

This project is licensed under the MIT license.

Links