Crate fibers_rpc

Crate fibers_rpc 

Source
Expand description

RPC library built on top of fibers crate.

§Features

  • Asynchronous RPC server/client using fibers crate
  • Support two type of RPC:
    • Request/response model
    • Notification model
  • Strongly typed RPC using bytecodec crate
    • You can treat arbitrarily Rust structures that support serde as RPC messages
    • It is possible to handle huge structures as RPC messages without compromising efficiency and real-time property by implementing your own encoder/decoder
  • Multiplexing multiple RPC messages in a single TCP stream
  • Prioritization between messages
  • Expose Prometheus metrics

§Technical Details

See doc/.

§Examples

Simple echo RPC server:

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);

Modules§

channel
RPC channel related components.
client
RPC client.
metrics
Prometheus metrics.
server
RPC server.

Structs§

Error
This crate specific Error type.
ProcedureId
The identifier of a procedure.

Enums§

ErrorKind
Possible error kinds.

Traits§

Call
Request/response RPC.
Cast
Notification RPC.

Type Aliases§

Result
This crate specific Result type.