35个版本

0.3.4 2020年9月7日
0.3.3 2019年9月11日
0.3.2 2019年8月18日
0.3.1 2019年3月31日
0.1.10 2018年3月23日

#1485 in 网络编程

Download history 2/week @ 2023-12-04 10/week @ 2023-12-11 19/week @ 2023-12-18 12/week @ 2023-12-25 22/week @ 2024-01-08 10/week @ 2024-01-15 10/week @ 2024-02-05 20/week @ 2024-02-12 95/week @ 2024-02-19 40/week @ 2024-02-26 28/week @ 2024-03-04 36/week @ 2024-03-11 33/week @ 2024-03-18

每月 170 下载
9 crate 中使用

MIT 协议

120KB
3K SLoC

fibers_rpc

Documentation Build Status Code Coverage License: MIT

Rust RPC库,基于fibers crate构建。

文档

特性

  • 使用fibers crate的异步RPC服务器/客户端
  • 支持两种RPC类型
    • 请求/响应模型
    • 通知模型
  • 使用bytecodec crate进行强类型RPC
    • 可以将支持serde的任意Rust结构体视为RPC消息
    • 通过实现自己的编码器/解码器,可以在不牺牲效率和时间属性的情况下处理大型结构体作为RPC消息
  • 在单个TCP流中多路复用多个RPC消息
  • 消息之间的优先级
  • 公开Prometheus指标

技术细节

doc/

示例

简单的echo RPC服务器

use bytecodec::bytes::{BytesEncoder, RemainingBytesDecoder};
use fibers_rpc::{Call, ProcedureId};
use fibers_rpc::client::ClientServiceBuilder;
use fibers_rpc::server::{HandleCall, Reply, ServerBuilder};
use futures::Future;

// RPC definition
struct EchoRpc;
impl Call for EchoRpc {
    const ID: ProcedureId = ProcedureId(0);
    const NAME: &'static str = "echo";

    type Req = Vec<u8>;
    type ReqEncoder = BytesEncoder<Vec<u8>>;
    type ReqDecoder = RemainingBytesDecoder;

    type Res = Vec<u8>;
    type ResEncoder = BytesEncoder<Vec<u8>>;
    type ResDecoder = RemainingBytesDecoder;
}

// RPC server
struct EchoHandler;
impl HandleCall<EchoRpc> for EchoHandler {
    fn handle_call(&self, request: <EchoRpc as Call>::Req) -> Reply<EchoRpc> {
        Reply::done(request)
    }
}
let server_addr = "127.0.0.1:1919".parse().unwrap();
let mut builder = ServerBuilder::new(server_addr);
builder.add_call_handler(EchoHandler);
let server = builder.finish(fibers_global::handle());
fibers_global::spawn(server.map_err(|e| panic!("{}", e)));

// RPC client
let service = ClientServiceBuilder::new().finish(fibers_global::handle());
let service_handle = service.handle();
fibers_global::spawn(service.map_err(|e| panic!("{}", e)));

let request = Vec::from(&b"hello"[..]);
let response = EchoRpc::client(&service_handle).call(server_addr, request.clone());
let response = fibers_global::execute(response)?;
assert_eq!(response, request);

非正式基准测试结果(v0.2.1)

$ uname -a
Linux DESKTOP 4.4.0-43-Microsoft #1-Microsoft Wed Dec 31 14:42:53 PST 2014 x86_64 x86_64 x86_64 GNU/Linux

$ lscpu | grep 'Model name:'
Model name:            Intel(R) Core(TM) i7-7660U CPU @ 2.50GHz

// Runs the example echo server in a shell.
$ cargo run --example echo --release -- server

// Executes a benchmark command in another shell.
$ echo "hello" | cargo run --example echo --release -- bench -c 1024 -n 1000000
# ELAPSED: 8.111424
# RPS: 123282.91555218912

依赖项

~3.5MB
~69K SLoC