| Crates.io | ruapc |
| lib.rs | ruapc |
| version | 0.1.2 |
| created_at | 2025-07-19 09:55:35.854257+00 |
| updated_at | 2025-08-26 14:22:48.167445+00 |
| description | A Rust RPC library |
| homepage | https://github.com/SF-Zhou/ruapc |
| repository | https://github.com/SF-Zhou/ruapc |
| max_upload_size | |
| id | 1760080 |
| size | 174,751 |
A Rust RPC library.
Define service:
#![feature(return_type_notation)]
use ruapc::{Context, Result};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct Request(pub String);
#[ruapc::service]
pub trait EchoService {
async fn echo(&self, c: &Context, r: &Request) -> Result<String>;
}
Start server:
use ruapc::*;
use ruapc_demo::{EchoService, Request};
use std::{net::SocketAddr, str::FromStr, sync::Arc};
struct DemoImpl;
impl EchoService for DemoImpl {
async fn echo(&self, _c: &Context, r: &Request) -> Result<String> {
Ok(r.0.clone())
}
}
#[tokio::main]
async fn main() {
let demo = Arc::new(DemoImpl);
let mut router = Router::default();
router.add_methods(EchoService::ruapc_export(demo.clone()));
let server = Server::create(router, &SocketPoolConfig::default());
let server = Arc::new(server);
let addr = SocketAddr::from_str("127.0.0.1:8000").unwrap();
let addr = server.listen(addr).await.unwrap();
println!("Serving on {addr}...");
server.join().await
}
Make a request:
use ruapc::*;
use ruapc_demo::{EchoService, Request};
use std::{net::SocketAddr, str::FromStr};
#[tokio::main]
async fn main() {
let addr = SocketAddr::from_str("127.0.0.1:8000").unwrap();
let ctx = Context::create(&SocketPoolConfig::default()).with_addr(addr);
let client = Client::default();
let rsp = client.echo(&ctx, &Request("Rua!".into())).await;
println!("echo rsp: {:?}", rsp);
}
You could also directly execute the stress program provided in ruapc-demo.
# 1. start the server. the socket type can be `tcp`, `ws`, `http`, or `unified`, where `unified` supports TCP, WebSocket, and HTTP protocols simultaneously.
cargo run --release --bin server -- --socket-type unified
# 2. start the client.
cargo run --release --bin client -- --stress --coroutines 128 --secs 10 --socket-type tcp
cargo run --release --bin client -- --stress --coroutines 128 --secs 10 --socket-type ws
cargo run --release --bin client -- --stress --coroutines 128 --secs 10 --socket-type http
# 3. you can also use curl to send HTTP requests.
curl -s -X POST -d '"hello HTTP"' http://0.0.0.0:8000/EchoService/echo | json_pp
#> {
#> "Ok" : "hello HTTP"
#> }
curl -s -X POST http://0.0.0.0:8000/MetaService/list_methods | json_pp
#> {
#> "Ok" : [
#> "EchoService/echo",
#> "MetaService/list_methods",
#> "MetaService/get_metadata",
#> "GreetService/greet"
#> ]
#> }