2个不稳定版本
0.2.0 | 2023年10月3日 |
---|---|
0.1.0 | 2023年7月29日 |
#9 in #rpc-service
27KB
293 行
MARPC - 基于宏的、无样板代码的RPC库
这是一个简单的RPC库,灵感来源于来自server_fn
的leptos
生态系统。它允许您定义将在服务器上运行但由客户端调用的函数。主要用例是具有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-MIT 和 LICENSE-APACHE。
依赖项
~0.7–1.4MB
~33K SLoC