mill-rpc
An RPC framework built on mill-io and mill-net. Define services declaratively, get type-safe clients and servers — no async runtime required.
Features
- Zero async: Handlers are plain synchronous functions
- Macro-driven:
mill_rpc::service!generates a module with server trait, client struct, and dispatch logic - Selective generation: Use
#[server],#[client], or both (default) - Multi-service: Host multiple services on a single port with automatic routing
- Pluggable codecs: Bincode by default, extensible
- Binary wire protocol: Efficient framing with one-way calls and ping/pong
Quick Start
Define a service
service!
This generates a calculator module containing:
calculator::Service: trait to implement on the servercalculator::server(impl): wraps your impl for registrationcalculator::Client: struct with typed RPC methodscalculator::methods: method ID constants
Server
;
Client
let transport = connect.unwrap;
let client = new;
let sum = client.add.unwrap; // 35
let prod = client.multiply.unwrap; // 56
Selective Generation
Generate only what you need:
// Server crate: no client code generated
service!
// Client crate: no server code generated
service!
// Both (default): for tests, examples, or single-binary apps
service!
Multi-Service Server
service!
service!
let _server = builder
.bind
.service // service_id = 0
.service // service_id = 1
.build?;
// Client side: share one connection
let math = new;
let strings = new;
Examples
# Terminal 1 # Terminal 2
# Self-contained stress test
License
Licensed under the Apache License, Version 2.0. See LICENSE for details.