9个版本
0.3.5 | 2021年8月3日 |
---|---|
0.3.4 | 2021年7月14日 |
0.3.3 | 2021年3月25日 |
0.2.0 | 2021年3月24日 |
0.1.1 | 2021年3月23日 |
#665 in HTTP服务器
105KB
2.5K SLoC
moleculer-rs
受Moleculer JS启发并与之兼容
你现在可以完成所有基本的 emit
、broadcast
和 call
操作。
但是它只支持 NATS
转发器和 JSON
序列化/反序列化。
入门
在crates上可用: crates.io/moleculer
文档可在: docs.rs/moleculer 查找
moleculer = "0.3.3"
简单示例展示了如何接收事件、响应请求,更多内容请查看 示例文件夹
use std::error::Error;
use moleculer::{
config::{ConfigBuilder, Transporter},
service::{Context, Event, EventBuilder, Service},
ServiceBroker,
};
use serde::Deserialize;
#[tokio::main]
async fn main() -> eyre::Result<()> {
env_logger::init();
color_eyre::install()?;
// build config
let config = ConfigBuilder::default().transporter(Transporter::nats("nats://127.0.0.1:4222"))
.build();
// create the first event
let print_hi = EventBuilder::new("printHi").add_callback(print_hi).build();
// create the second event
let print_name = EventBuilder::new("printName")
.add_callback(print_name)
.build();
// create math action
let math_action = ActionBuilder::new("mathAdd").add_callback(math_add).build();
// create a service with events and actions
let greeter_service = Service::new("rustGreeter")
.add_event(print_hi)
.add_event(print_name)
.add_action(math_action);
// create service broker with service
let service_broker = ServiceBroker::new(config).add_service(greeter_service);
// start the service broker
service_broker.start().await;
Ok(())
}
// callback for first event, will be called whenever "printHi" event is received
fn print_hi(_ctx: Context<Event>) -> Result<(), Box<dyn Error>> {
println!("Hello from Rust");
Ok(())
}
// callback for second event, will be called whenever "printName" event is received
fn print_name(ctx: Context<Event>) -> Result<(), Box<dyn Error>> {
let msg: PrintNameMessage = serde_json::from_value(ctx.params)?;
println!("Hello to: {} from Rust", msg.name);
Ok(())
}
// callback for math action
fn math_add(ctx: Context<Action>) -> Result<(), Box<dyn Error>> {
// get message decode using serde
let msg: ActionMessage = serde_json::from_value(ctx.params.clone())?;
let answer = msg.a + msg.b;
// serialize reply using serde and send reply
let _ = ctx.reply(answer.into());
Ok(())
}
#[derive(Deserialize)]
struct PrintNameMessage {
name: String,
}
#[derive(Deserialize)]
struct ActionMessage {
a: i32,
b: i32,
}
当前状态
可用但缺少一些选项
它能做什么
- 可以被其他moleculer客户端发现
- 仅NATS转发器
- 仅JSON序列化/反序列化
- 可以
emit
和broadcast
事件 - 可以
call
发送请求并等待响应(#20) - 可以响应来自其他moleculer客户端的事件,使用回调(参见: 简单事件示例)
- 可以创建操作,并响应请求(#19)
缺少什么
依赖项
~23–36MB
~658K SLoC