5 个版本
0.2.2 | 2019 年 9 月 19 日 |
---|---|
0.2.0 | 2019 年 8 月 19 日 |
0.1.3 | 2019 年 8 月 12 日 |
0.1.2 | 2019 年 8 月 10 日 |
0.1.1 | 2019 年 8 月 7 日 |
#55 in #微服务
73KB
1.5K SLoC
rpcx-rs
Rust 版本的 rpcx rpc/microservice 框架的库。
使用最简单的风格来探索 Rust 函数作为跨平台的 rpc 服务。
如果你能写 Rust 函数,你就能写 rpc 服务。这很简单。
查看所有示例: rpcx-rs-examples.
路线图
0.1.x
协议和客户端/服务器库。
- 协议
- 客户端(同步/异步调用)
- 支持 JSON、MessagePack 和 Protobuf
- 服务实现
0.2.x
- 服务发现
- 静态多个对等节点
- etcd
- consul
- 服务治理
- 选择模式
- RandomSelect,
- RoundRobin
- WeightedRoundRobin
- WeightedICMP
- ConsistentHash
- Closest
- Custiomized
- 故障模式
- Failover
- Failfast
- Failtry
0.3.x
- 插件
- 文档
- 单元测试和集成测试
- 其他功能,如 Go 语言实现
使用方法
将此添加到你的 Cargo.toml 文件中
[dependencies]
rpcx = "0.2.0"
示例
编写参数和回复
首先,你应该编写参数和回复。它们被 rpc 服务和客户端使用。
use std::error::Error as StdError;
use rmp_serde as rmps;
use serde::{Deserialize, Serialize};
use rpcx_derive::*;
use rpcx_protocol::{Error, ErrorKind, Result, RpcxParam, SerializeType};
#[derive(RpcxParam, Default, Debug, Copy, Clone, Serialize, Deserialize)]
pub struct ArithAddArgs {
#[serde(rename = "A")]
pub a: u64,
#[serde(rename = "B")]
pub b: u64,
}
#[derive(RpcxParam, Default, Debug, Copy, Clone, Serialize, Deserialize)]
pub struct ArithAddReply {
#[serde(rename = "C")]
pub c: u64,
}
你必须将 RpcxParam
、Serialize
、Deserialize
和 Default
特性添加到 derive
中。Rpcx 可以添加序列化的辅助方法。
如果不这样做,你需要手动实现 RpcxParam
和 Default
。
在这里,我们定义了 ArithAddArgs
作为参数类型,ArithAddReply
作为回复类型。
实现服务器
use mul_model::{ArithAddArgs, ArithAddReply};
use rpcx::*;
fn add(args: ArithAddArgs) -> ArithAddReply {
ArithAddReply { c: args.a + args.b }
}
fn mul(args: ArithAddArgs) -> ArithAddReply {
ArithAddReply { c: args.a * args.b }
}
fn main() {
let mut rpc_server = Server::new("127.0.0.1:8972".to_owned());
register_func!(
rpc_server,
"Arith",
"Add",
add,
ArithAddArgs,
ArithAddReply
);
register_func!(
rpc_server,
"Arith",
"Mul",
mul,
ArithAddArgs,
ArithAddReply
);
rpc_server.start().unwrap();
}
在这里,我们实现了两个服务:add
和 mul
。我们使用 register_func!
宏将它们及其导出名称(service_path
和 service_method
)注册。客户端可以使用此名称来访问它们。
实现客户端
在这里,我们使用一个客户端循环访问 Arith.Mul
服务。
use std::collections::hash_map::HashMap;
use mul_model::*;
use rpcx::Client;
use rpcx::{Result, SerializeType};
pub fn main() {
let mut c: Client = Client::new("127.0.0.1:8972");
c.start().map_err(|err| println!("{}", err)).unwrap();
c.opt.serialize_type = SerializeType::JSON;
let mut a = 1;
loop {
let service_path = String::from("Arith");
let service_method = String::from("Mul");
let metadata = HashMap::new();
let args = ArithAddArgs { a: a, b: 10 };
a += 1;
let reply: Option<Result<ArithAddReply>> =
c.call(service_path, service_method, false, metadata, &args);
match reply {
Some(Ok(r)) => println!("received: {:?}", r),
Some(Err(err)) => println!("received err:{}", err),
None => {}
}
}
}
实际上,你可以使用这个客户端来访问其他程序语言(如 Go 语言服务)实现的 rpcx 服务。
正如你所见,只需三个步骤,你就可以将 Rust 函数(add
和 mul
)作为 rpc 服务探索。
你可以在 rpcx-rs/examples 中找到更多示例。
许可证
rpcx-rs 在 MIT 许可证下发布。
请参阅LICENSE-APACHE、LICENSE-MIT和COPYRIGHT以获取详细信息。
依赖项
~14MB
~281K SLoC