2个不稳定版本

0.2.0 2023年10月3日
0.1.0 2023年7月29日

#9 in #rpc-service

MIT/Apache

27KB
293

MARPC - 基于宏的、无样板代码的RPC库

crates.io docs.rs license MIT or Apache 2.0

API文档

这是一个简单的RPC库,灵感来源于来自server_fnleptos生态系统。它允许您定义将在服务器上运行但由客户端调用的函数。主要用例是具有Rust前端的Web应用程序,但该库旨在易于适应,不对传输协议或序列化格式施加任何限制。

[dependencies]
marpc = "0.2.0"

功能

  • 在单个位置定义函数,从客户端调用它们并在服务器上执行。
  • 无样板代码。RPC在单个位置定义,功能标志控制是否为客户端、服务器或两者生成代码。
  • "自带传输"。在客户端使用ClientRpcService::handle,在服务器上使用handle_rpc来控制RPC调用如何到达服务器并返回响应。
  • "自带(反)序列化器"。您可以为您的RPC调用使用任何类型的(反)序列化器。marpc还定义了一个简单的json格式,您可以使用。

示例

首先定义一个RPC服务

struct Service;

impl marpc::RpcService for Service {
    type Format = marpc::Json;
}

#[cfg(feature = "client")]
impl marpc::ClientRpcService for Service {
    type ClientError = Box<dyn std::error::Error>;

    fn handle<'a>(
        uri: &'static str,
        payload: &'a [u8],
    ) -> Pin<Box<dyn 'a + Future<Output = Result<Vec<u8>, Self::ClientError>>>> {
        // Send payload to the server
    }
}

#[cfg(feature = "server")]
marpc::register_service!(Service);

使用以下方式定义RPC函数

#[marpc::rpc(AddRpc, uri = "/api/add", service = Service)]
async fn add(a: i32, b: i32) -> Result<i32, ()> {
    Ok(a + b)
}

然后在客户端调用它们

add(5, 6).await;

在服务器上,您可以使用以下方式处理RPC调用

marpc::handle_rpc::<Service>(uri, (), payload).await

有关简单示例,请参阅examples/add.rs。注意,必须使用--all-features--features client,server进行编译,因为客户端和服务器代码都需要生成。

请参阅 examples/hello_net.rs 以获取一个更复杂的示例,其中包含客户端和服务器通过 TCP 流进行通信。在一个窗口中运行 cargo run --features server --example hello_net -- server Hello,然后在另一个窗口中运行 cargo run --features client --example hello_net -- client world

许可证

此库采用 MIT 许可证和 Apache 许可证 2.0 双许可。请自行选择要使用的许可证。请参阅 LICENSE-MITLICENSE-APACHE

依赖项

~0.7–1.4MB
~33K SLoC