#http-service #microservices #http-api #transport #data #node #codec

nightly bin+lib cakerabbit-core

A rust微服务框架,这是项目的核心内核

3个版本

0.1.3 2022年3月25日
0.1.1 2021年11月14日
0.1.0 2021年9月1日

#634 in HTTP服务器

MIT/Apache

78KB
1.5K SLoC

CakeRabbit-core

A rust微服务框架,这是项目的核心内核。

  • 传输

    • TCP
    • 支持tikio异步future
    • msgpack编解码器传输
    • grpc编解码器传输
  • 服务

    • 注册服务函数
    • 支持HTTP API的服务
    • 监视节点服务数据变化,更新服务节点数据缓存
    • 支持注册第三方HTTP服务使用CakeRabbit,您可以使用此方法注册Rust HTTP服务,并通过rpcx-plus-gateway(goland)调用服务,我将很快发布此网关项目。
  • 服务器

    • RPC服务器(tokio future)
    • Http服务器(actix-web)
  • 客户端

    • RPC客户端(tokio future)
    • 客户端缓存服务节点数据,提高传输性能
  • 注册

    • Consul
  • 故障模式

    • 故障转移
    • 快速失败
    • 尝试失败
  • 选择器

    • 随机
    • 轮询

用法

在Cargo.toml中设置

[dependencies]
cakerabbit-core = "0.1.1"

示例

编写一个EchoRs服务,注册方法say_hello()。如果您想使用本地项目源进行开发,请检查./examples/echo_use_localsource文件夹中的示例。运行命令,检查toml文件。

cargo.exe run --example echoserver

cargo.exe run --example echoclient

如果您想使用crate.io源进行开发,请检查./examples/echo_use_crateio文件夹中的示例。运行命令,检查toml文件。

cd ./examples/echo_use_crateio

cargo.exe run --example echoserver
# server with http
# cargo.exe run --examplee choserver_httpapi

cargo.exe run --example echoclient

服务器

支持HTTP的服务,请检查代码server_use_cake_httpapi.rs

const SVC_NAME: &str = "EchoRs";

#[derive(Default, Serialize, Deserialize, Debug, Clone)]
struct SayHelloReply {
  name: String,
}

fn say_hello(params: &[Value]) -> CakeResult<Vec<u8>> {
  if let Value::String(ref value) = params[0] {
    if let Some(val) = value.as_str() {
      let rsp = SayHelloReply {
        name: "foo".to_string()
      };
      let rsp_vec = serde_json::to_vec(&rsp).unwrap();
      return Ok(rsp_vec);
    }
  }
  Ok(Vec::from("wrong param".to_string()))
}

#[tokio::main]
async fn main() -> io::Result<()> {
  env_logger::from_env(Env::default().default_filter_or("info")).init();
  let mut svc_serve = CakeServiceServe::new(SVC_NAME.to_string(),
                                            "cake/".to_string(),
                                            "0.0.0.0:9527".to_string(),
                                            "consul".to_string(),
                                            "localhost:8500".to_string(),
                                            "1m0s".to_string(),
                                            false);
  // todo: register svc method
  svc_serve.register_fn("say_hello".into(),
                        say_hello,
                        &["foo".into()]);

  // todo: run
  svc_serve.run().await;

  Ok(())
}

客户端

编写一个客户端调用EchoRs服务

#[tokio::main]
async fn main() -> io::Result<()> {
  env_logger::init();

  let fm = FailMode::Failtry(Failtry{ retries: 3 });
  let mut cake_client = CakeClient::new("cake/".into(),
                                        "EchoRs".into(),
                                        "consul".into(),
                                        "localhost:8500".into(),
                                        SelectorTyp::RoundRobin,
                                        FailMode::FailFast);
                                         // fm);
  let res = cake_client.call("say_hello", &["foo".into()]).await;
  match res {
    Ok(rsp) => {
      println!("rsp ------------ {}", rsp);
    }
    Err(err) => {
      println!("err ------------------ {:?}", err);
    }
  }
}

使用rpcx-plus-gateway构建服务

您可以使用以下方法构建服务

注意

  1. 不要在rpc函数程序中使用tokio runtime block_on,因为rust future,将发生错误 Cannot start a runtime from within a runtime,cakeRabbit基于tokio runtime

特性

  1. 易于使用,保持简单

  2. 网关支持使用RESTFUL API使用外部服务

  3. 更多编程语言支持,cakeRabbit-code传输编解码器基于msgpack(grpc等),这意味着如果您使用Rust编写服务,它可以通过其他语言调用。

  4. 服务治理UI,服务注册中心可以使用consul、etcd、zookeeper。

性能

依赖项

~29–42MB
~752K SLoC