3个版本

0.0.3 2024年8月4日
0.0.2 2024年7月28日
0.0.1 2024年7月28日

#989 in 网络编程

Download history 146/week @ 2024-07-22 181/week @ 2024-07-29 36/week @ 2024-08-05

每月363次下载

MIT许可证

42KB
835 代码行

Crates.io Documentation License: MIT

mrpc

使用Rust实现的MessagePack-RPC。

功能

  • 编写异步RPC服务器和客户端
  • 支持TCP和Unix域套接字
  • 完整的msgpack-rpc实现(请求、响应、通知)
  • 支持双向通信 - 服务器和客户端都可以处理传入的RPC消息
  • 基于tokio进行异步I/O
  • 使用rmpv进行MessagePack序列化

快速入门

use mrpc::{Client, Connection, Result, RpcSender, Server};
use rmpv::Value;

#[derive(Clone, Default)]
struct Echo;

#[async_trait::async_trait]
impl Connection for Echo {
    async fn handle_request(
        &self,
        _: RpcSender,
        method: &str,
        params: Vec<Value>,
    ) -> Result<Value> {
        Ok(format!("{} -> {}", method, params[0]).into())
    }
}

#[tokio::main]
async fn main() -> Result<()> {
    // We're just using the default constructor as our ConnectionMaker
    let server = Server::from_fn(Echo::default).tcp("127.0.0.1:0").await?;
    let addr = server.local_addr().unwrap();
    tokio::spawn(server.run());

    // `Connection` is implemented for (), as a convenience for clients who don't need to handle
    // requests or responses.
    let client = Client::connect_tcp(&addr.to_string(), ()).await?;
    let result = client
        .send_request("echo", &[Value::String("Hello there!".into())])
        .await?;
    println!("{}", result);
    Ok(())
}

依赖项

~4–11MB
~98K SLoC