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 #微服务

MIT 许可证

73KB
1.5K SLoC

rpcx-rs

Build Status Crate API

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,
}

你必须将 RpcxParamSerializeDeserializeDefault 特性添加到 derive 中。Rpcx 可以添加序列化的辅助方法。

如果不这样做,你需要手动实现 RpcxParamDefault

在这里,我们定义了 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();
}

在这里,我们实现了两个服务:addmul。我们使用 register_func! 宏将它们及其导出名称(service_pathservice_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 函数(addmul)作为 rpc 服务探索。

你可以在 rpcx-rs/examples 中找到更多示例。

许可证

rpcx-rs 在 MIT 许可证下发布。

请参阅LICENSE-APACHELICENSE-MITCOPYRIGHT以获取详细信息。

依赖项

~14MB
~281K SLoC