2 个不稳定版本
0.2.0 | 2023年7月31日 |
---|---|
0.1.0 | 2023年2月1日 |
#492 in #rpc
每月下载量102次
在 7 个 crate 中使用(通过 arpy)
5KB
Arpy:Rust 的 RPC
定义您的 RPC 签名,并使用各种客户端/服务器实现来使用它们。
项目状态
Arpy 处于初级阶段,尚未经过充分测试。
传输实现
Reqwest 和 Reqwasm 客户端可用,以及 Axum 和 Actix 服务器。
用法
定义您的 RPC 签名,在服务器上实现它们,并在客户端调用它们。这些可以位于不同的 crate 中,也可以根据您的流程全部在一个 crate 中。
定义 RPC 签名
#[derive(MsgId, Serialize, Deserialize, Debug)]
pub struct Add(pub i32, pub i32);
impl FnRemote for Add {
type Output = i32;
}
#[derive(MsgId, Serialize, Deserialize, Debug)]
pub struct TryMultiply(pub i32, pub i32);
impl FnRemote for TryMultiply {
type Output = Result<i32, ()>;
}
实现服务器
使用 Axum 的示例
async fn add(args: &Add) -> i32 {
args.0 + args.1
}
async fn try_multiply(args: &TryMultiply) -> Result<i32, ()> {
Ok(args.0 * args.1)
}
let app = Router::new()
.http_rpc_route("/http", add)
.http_rpc_route("/http", try_multiply);
Server::bind(&SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 9090))
.serve(app.into_make_service())
.await
.unwrap();
调用远程过程
使用 Reqwasm 的示例
let connection = http::Connection::new(&format!("http://127.0.0.1:9090/api"));
let result = Add(1, 2).call(&connection).await?;
assert_eq!(3, result);
其他功能
- Websocket 支持,包括
- 多个并发 RPC 调用
- 参数化订阅
- 服务器发送事件
依赖项
~1.5MB
~35K SLoC