3 个版本

0.1.2 2021 年 1 月 17 日
0.1.1 2021 年 1 月 17 日
0.1.0 2021 年 1 月 17 日

#7 in #理解

MIT 许可证

16KB
127

一个易出错、非常慢且难以使用的玩具 RPC 框架

但是..为什么?

因为我现在正在上分布式系统课,RPC 是一个主题...那么,要理解一个主题,最好的办法是去实现它?

所以这就是它的来源。我再重复一遍,这是一个玩具。请勿使用

一般信息

这个库建立在两个主要的协议/概念之上

  • JSON 序列化
  • TCP

JSON 被用于所有操作,作为一种方便(但可能较慢)的方式来将数据类型序列化为字符串。然后,字符串被转换为 UTF8 字节并传递下去。 TCP 是我们选择的传输层协议。它使得将字节从 A 点移动到 B 点变得容易.. 所以为什么不呢。再次强调,这是一个玩具。不适用于基准测试或其他用途

如何使用

这个库包括两个主要的结构体:一个 Client 结构体和一个 Server 结构体。服务器是用来注册 RPC 函数的,然后客户端可以调用它们。

示例

示例客户端

use rpc_toy::Client;
// You can create a new client using "new"
let mut client = Client::new("127.0.0.1:3001").unwrap();
// All arguments have to be passed in as a slice of `serde_json::Value`s
let one = serde_json::to_value(1u32).unwrap();
let two = serde_json::to_value(2u32).unwrap();
let args = vec![one, two];
// Use the `call` function to call remote procedures
let res = client.call("Add", &args).unwrap();

let three: u32 = serde_json::from_value(res.unwrap()).unwrap();
assert_eq!(three, 3);

示例服务器

use rpc_toy::Server;
let mut server = Server::new();
server.register("Add", |args| {
    let one = args.get(0).unwrap();
    let two = args.get(1).unwrap();
    let one = serde_json::from_value::<u32>(one.clone()).unwrap();
    let two = serde_json::from_value::<u32>(two.clone()).unwrap();
    let three = one + two;
    return Some(serde_json::to_value(three).unwrap());
});
server.listen("127.0.0.1:3001").unwrap();

消息编码

客户端消息编码
函数名称长度的 32 位
函数名称
参数长度,或零表示结束
作为 JSON 字符串 utf8 编码的参数
第二个参数长度,或零表示结束
重复直到结束 ...

服务器消息编码
响应长度的 32 位
作为 JSON 字符串 utf8 编码的响应

依赖

~1–2MB
~41K SLoC