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 异步
180KB
3.5K SLoC
fizyr-rpc
Rust 实现 Fizyr RPC 协议。
Fizyr RPC 协议是一种请求/响应协议,只要请求保持打开状态,就具有双向反馈。此外,您还可以发送不引发请求的独立流消息。
概述
对等节点和对等节点句柄
作为库的用户,您将主要使用 PeerHandle
对象。该 PeerHandle
用于与远程对等节点交互。它用于发送和接收请求和流消息。它还可以分割为 PeerReadHandle
和 PeerWriteHandle
,以便将句柄移动到不同的任务中。写句柄也可以被克隆并在多个任务中使用。
要获取 PeerHandle
,您可以调用 Peer::connect()
。这将连接到远程监听器并生成一个后台任务来读取和写入连接上的消息。如果您需要完全控制任务,您还可以创建一个 Peer
对象并手动调用 Peer::run()
。
监听器
结构体 Listener
用于接受传入连接,并为每个传入连接提供一个 PeerHandle
。然后您可以使用此句柄来处理传入的消息并向对等方发送消息。通常,您会为每个接受的连接启动一个任务来处理通信。
传输
每个对等体内部使用一个 Transport
。传输负责读取和写入原始消息。通过抽象消息传输,该库可以公开一个通用的 Peer
和 Listener
结构体。
针对不同的套接字类型有不同的传输。不同的传输可能也使用不同的消息体类型。例如,TcpTransport
和 UnixStreamTransport
使用 StreamBody
类型的消息。这个 StreamBody
体类型包含原始字节。
UnixSeqpacketTransport
的消息带有 UnixBody
,这使得您可以将文件描述符嵌入到每个消息中。
特性
该库使用特性来避免不必要的庞大依赖关系。每个特性对应于不同的传输类型。默认情况下,没有任何特性被启用。目前,该库有以下特性
tcp
:用于TcpTransport
unix-stream
:用于UnixStreamTransport
unix-seqpacket
:用于UnixSeqpacketTransport
示例
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