22个版本

0.4.1 2021年4月27日
0.2.0 2021年2月12日
0.1.14 2020年12月31日
0.1.12 2020年11月8日

#fce中排名1

每月下载量40

Apache-2.0

18KB
290

Marine

marine version on crates.io Coverage Status

Marine 是一个基于 组件模型 的现代通用 Wasm 运行时,能够运行多模块 Wasm 应用程序,即服务,使用 interface-types无共享链接 方案。此执行模型非常适合各种场景,尤其适用于遵循 实体组件系统 (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 模块的 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:一个 Fluence FaaS 层,提供主机闭包、IT<->JSON 转换、日志记录、配置处理和其他功能
  • fluence-app-service:一个 Fluence 应用服务层,提供服务运行的基本 API
  • runtime:一个运行时层,提供加载、卸载和调用模块的基本功能
  • marine-js:一个面向在浏览器中运行 Marine 的 Web 运行时层
  • 工具
    • REPL:用于测试 Marine Wasm 模块的 REPL
    • CLI:一个用于构建和从 Marine Wasm 模块中提取信息的命令行界面

支持

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

贡献

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

许可证

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

依赖关系

~18–34MB
~545K SLoC