前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Rust项目推荐】Rust RPC框架,可以通过WebSocket和JS通信,可用于进程间通信

【Rust项目推荐】Rust RPC框架,可以通过WebSocket和JS通信,可用于进程间通信

作者头像
MikeLoveRust
发布2019-12-25 17:13:53
3.9K0
发布2019-12-25 17:13:53
举报

https://github.com/metaworm/easy-rpc

easy-rpc 是跨通信方式的Rust RPC框架,也有其他语言实现。

Rust

JavaScript

WebSocket

SharedMem

WebSocket/JavaScript用于Rust和网页交互数据,共享内存(SharedMem)用于进程间通信。

优点

  • 基于MsgPack,不需要协议文件,动态解析类型
  • 通信双方可以递归地Request,类似本地的函数递归调用

缺点

easy-rpc(目前)不是异步实现,每一个会话都会占据一个线程。如果你用在有大量IO的服务端上,可能不太合适。

文档

有待完善。可以参考test里的例子,如果你用过serde系列库,应该会很容易上手。

注意事项

easy-rpc目前依赖一个git库,所以没有发布到 crates.io,使用时要通过git引用。

Cargo.toml

代码语言:javascript
复制
[package]
# ...

[dependencies]
# ...
easy-rpc = {git = 'https://github.com/metaworm/easy-rpc'}

示例

代码语言:javascript
复制
use std::sync::Arc;
use easy_rpc::*;

struct ServerService;

const MUL: u32 = 1;
easy_service! {
    ServerService(self, _ss, arg, response)

    StringMethod {
        "add" => (a: u32, b: u32) {
            a + b
        }
        "print" => (s: String) {
            println!("{}", s);
        }
    }
    IntegerMethod {
        MUL => (a: u32, b: u32) {
            a * b
        }
    }
}

fn main() -> Result<(), Box<dyn std::error::Error>> {
    std::thread::spawn(|| {
        let mut ser = ws::bind("127.0.0.1:3333").unwrap();
        let (adaptor, _uri) = ws::accept(&mut ser).unwrap();
        Session::new(adaptor, Arc::new(ServerService)).loop_handle();
    });

    std::thread::sleep_ms(100);
    let session = Session::new(ws::connect("ws://127.0.0.1:3333")?, Arc::new(EmptyService));
    let val: u32 = session.request("add", (1, 2)).into()?;
    session.notify("print", format!("the result is {}", val));
    let val: u32 = session.request(MUL, (2, 3)).into()?;
    assert_eq!(val, 6);

    Ok(())
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Rust语言学习交流 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 优点
  • 缺点
  • 文档
  • 注意事项
  • 示例
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档