36个版本 (4个重大更改)

0.7.2 2021年4月29日
0.5.2 2021年2月28日
0.1.24 2020年12月31日
0.1.17 2020年11月10日

#22#marine

Download history 8/week @ 2024-03-10 225/week @ 2024-03-31

每月58次 下载

Apache-2.0

24KB
473

Marine

marine version on crates.io Coverage Status

Marine 是一个基于 组件模型 的现代通用 Wasm 运行时,能够运行具有 接口类型无共享链接方案 的多模块 Wasm 应用程序,即服务。这种执行模型非常适合各种场景,尤其是遵循 实体组件系统 (ECS) 模式或基于插件的架构的实施。

Fluence 节点,例如 Fluence Rust 节点,包含 Marine 以执行由 Aqua 组成的托管 Wasm 服务。

动机示例

为了说明 Marine 的功能,让我们看看一个多模块 Wasm 服务,如在这个 示例 中实现的那样。

cd 进入 examples/motivational-example 目录,并查看 shrek/src/main.rs 文件

// examples/motivational-example/shrek/src/main.rs
use marine_rs_sdk::marine;

fn main() {}

#[marine]
pub fn greeting(name: &str) -> Vec<String> {
    let donkey_greeting = donkey::greeting(name);         // 1
    let shrek_greeting = format!("Shrek: hi, {}", name);  // 2
    
    vec![shrek_greeting, donkey_greeting]                 
}

mod donkey {                                               // 3
    use super::*;

    #[marine]
    #[link(wasm_import_module = "donkey")]                 // 4
    extern "C" {
        pub fn greeting(name: &str) -> String;
    }
}

在这个 Marine (Wasm) 模块(和命名空间) shrek 中,我们声明了一个函数 greeting,它从 donkey 模块的(3)greeting 函数中创建了一个 donkey_greeting(1),该函数本身依赖于从 donkey/src/main.rs(见下文)导入的 donkey Wasm 模块,使用 Rust 的 FFI link(4)。

// examples/motivational-example/donkey/src/main.rs
use marine_rs_sdk::marine;

fn main() {}

#[marine]
pub fn greeting(name: &str) -> String {
    format!("Donkey: hi, {}", name)
}

总结来说,我们的示例由两个独立的Wasm模块组成,分别是shrekdonkey,展示了如何将一个模块链接到另一个模块中,即在使用shrek模块时使用donkey模块。请注意,根据外观模式shrek模块被称为外观模块,每个服务中只能有一个外观模块。

请确保您已安装Marine工具(点击访问),并分别编译donkeyshrek,我们可以使用build.sh脚本完成这一步骤

$> ./build.sh

该脚本在artifacts目录中创建两个独立的Wasm模块

$> ls artifacts
donkey.wasm    shrek.wasm

现在我们有了我们的模块,我们可以使用Marine REPL来探索它们。请注意,我们使用Config.toml文件帮助REPL提供模块位置和名称。一旦REPL启动并运行,我们就可以与这两个模块交互,并且正如预期的那样,shrek模块能够成功访问donkey模块公开的函数。

$> marine repl Config.toml
...
1> interface
Loaded modules interface:

shrek:
  fn greeting(name: string) -> []string
donkey:
  fn greeting(name: string) -> string

2> call donkey greeting "no link module"
result: "Donkey: hi, no link module"
 elapsed time: 42.985µs

3> call shrek greeting "facade with link module"
result: [
  "Shrek: hi, facade with link module",
  "Donkey: hi, facade with link module"
]
 elapsed time: 39.25µs

4> q

看起来一切正常,模块已准备好部署到网络与Aqua进行组合

文档

别忘了查看我们的YouTube频道

仓库结构

  • crates
  • examples:几个主要用于测试的Marine示例
  • fluence-faas:提供主机闭包、IT<->JSON转换、日志记录、配置处理等功能的Fluence FaaS层
  • fluence-app-service:提供服务运行基本API的Fluence应用服务层
  • runtime:提供加载、卸载和调用模块的基本功能运行时层
  • marine-js:一个针对在浏览器中运行Marine的Web运行时层
  • 工具
    • REPL:用于测试Marine Wasm模块的REPL
    • CLI:一个用于构建和从Marine Wasm模块中提取信息的命令行工具

支持

如果您发现任何错误,请提交问题。您也可以在DiscordTelegram上联系我们。我们将尽力尽快解决问题。

贡献

任何感兴趣的人都可以为该项目做出贡献。请确保您已阅读并遵循一些基本的规则

许可

所有软件代码均为Fluence Labs, Inc.的版权(c),并遵循Apache-2.0许可。

依赖

~27–41MB
~726K SLoC