27 个版本

0.8.0 2023年12月11日
0.7.1 2023年11月26日
0.7.0 2023年9月20日
0.6.0 2023年3月3日
0.2.1 2020年11月2日

#1772 in 异步

BSD-2-Clause OR Apache-2.0

180KB
3.5K SLoC

Docs.rs Tests

fizyr-rpc

Rust 实现 Fizyr RPC 协议。

Fizyr RPC 协议是一种请求/响应协议,只要请求保持打开状态,就具有双向反馈。此外,您还可以发送不引发请求的独立流消息。

概述

对等节点和对等节点句柄

作为库的用户,您将主要使用 PeerHandle 对象。该 PeerHandle 用于与远程对等节点交互。它用于发送和接收请求和流消息。它还可以分割为 PeerReadHandlePeerWriteHandle,以便将句柄移动到不同的任务中。写句柄也可以被克隆并在多个任务中使用。

要获取 PeerHandle,您可以调用 Peer::connect()。这将连接到远程监听器并生成一个后台任务来读取和写入连接上的消息。如果您需要完全控制任务,您还可以创建一个 Peer 对象并手动调用 Peer::run()

监听器

结构体 Listener 用于接受传入连接,并为每个传入连接提供一个 PeerHandle。然后您可以使用此句柄来处理传入的消息并向对等方发送消息。通常,您会为每个接受的连接启动一个任务来处理通信。

传输

每个对等体内部使用一个 Transport。传输负责读取和写入原始消息。通过抽象消息传输,该库可以公开一个通用的 PeerListener 结构体。

针对不同的套接字类型有不同的传输。不同的传输可能也使用不同的消息体类型。例如,TcpTransportUnixStreamTransport 使用 StreamBody 类型的消息。这个 StreamBody 体类型包含原始字节。

UnixSeqpacketTransport 的消息带有 UnixBody,这使得您可以将文件描述符嵌入到每个消息中。

特性

该库使用特性来避免不必要的庞大依赖关系。每个特性对应于不同的传输类型。默认情况下,没有任何特性被启用。目前,该库有以下特性

示例

use fizyr_rpc::{TcpPeer, StreamConfig};

let (peer, info) = TcpPeer::connect("localhost:1337", StreamConfig::default()).await?;
eprintln!("Connected to: {}", info.remote_address());
let mut request = peer.send_request(1, &b"Hello World!"[..]).await?;

while let Some(update) = request.recv_update().await {
    let body = std::str::from_utf8(&update.body)?;
    eprintln!("Received update: {}", body);
}

let response = request.recv_response().await?;
let body = std::str::from_utf8(&response.body)?;
eprintln!("Received response: {}", body);

依赖关系

~2–10MB
~91K SLoC