#微服务 #兼容性 #框架 #NATS #JS #JSON #渐进式

moleculer

Rust的渐进式微服务框架,基于并兼容moleculerjs/moleculer

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服务器

Apache-2.0

105KB
2.5K SLoC

moleculer-rs

Build Status Crates.io Documentation Rust 1.47+

Moleculer JS启发并与之兼容

你现在可以完成所有基本的 emitbroadcastcall 操作。

但是它只支持 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序列化/反序列化
  • 可以 emitbroadcast 事件
  • 可以 call 发送请求并等待响应(#20
  • 可以响应来自其他moleculer客户端的事件,使用回调(参见: 简单事件示例
  • 可以创建操作,并响应请求(#19

缺少什么

  • 测试 #17
  • 操作上的更好错误处理 #24
  • 支持不同的序列化/反序列化 #23
  • 支持 BulkheadCircuitBreakerRetryPolicy
  • 支持跟踪
  • 支持NATS以外的不同转发器
  • 支持不同的记录器

依赖项

~23–36MB
~658K SLoC