3 个版本
0.1.2 | 2021 年 1 月 17 日 |
---|---|
0.1.1 | 2021 年 1 月 17 日 |
0.1.0 | 2021 年 1 月 17 日 |
#7 in #理解
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