3个版本
0.1.3 | 2022年3月25日 |
---|---|
0.1.1 | 2021年11月14日 |
0.1.0 | 2021年9月1日 |
#634 in HTTP服务器
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构建服务
您可以使用以下方法构建服务
注意
- 不要在rpc函数程序中使用tokio runtime block_on,因为rust future,将发生错误
Cannot start a runtime from within a runtime
,cakeRabbit基于tokio runtime
特性
-
易于使用,保持简单
-
网关支持使用RESTFUL API使用外部服务
-
更多编程语言支持,cakeRabbit-code传输编解码器基于msgpack(grpc等),这意味着如果您使用Rust编写服务,它可以通过其他语言调用。
-
服务治理UI,服务注册中心可以使用consul、etcd、zookeeper。
性能
依赖项
~29–42MB
~752K SLoC