5 个版本 (3 个重大更新)
0.5.1 | 2024年1月9日 |
---|---|
0.5.0 | 2023年3月14日 |
0.4.0 | 2021年12月15日 |
0.3.0 | 2021年12月14日 |
0.2.0 | 2021年5月10日 |
#1728 在 神奇豆子
1,172 每月下载量
在 19 个crate(3个直接使用) 中使用
4KB
Marine
Marine 是一个基于组件模型(组件模型)的现代通用 Wasm 运行时,能够运行多模块 Wasm 应用程序(即服务),使用 interface-types 和 无共享链接 方案。这种执行模型非常适合各种场景,尤其是适用于遵循 实体组件系统(ECS)模式或插件式架构的实施方案。
Fluence 对等节点,例如 Fluence Rust 节点,包含 Marine 以执行由 Aqua 组成的托管 Wasm 服务。
动机示例
为了展示 Marine 的功能,让我们看看在 这个示例 中实现的多模块 Wasm 服务。
切换到 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),该函数本身依赖于通过 Rust 的 FFI link
(4)导入的 donkey
Wasm 模块,具体请参考 donkey/src/main.rs
(见下文)。
// 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 模块组成,分别是 shrek
和 donkey
,展示了如何将一个模块链接到另一个模块中,即在 shrek
模块中使用 donkey
模块。请注意,shrek
模块称为 facade 模块,遵循 facade 模式,并且每个服务只能有一个 facade 模块。
请确保已安装 Marine 工具 (点击此处),并分别编译 donkey
和 shrek
,我们可以使用 build.sh
脚本完成此操作
$> ./build.sh
它创建了两个独立的 Wasm 模块,并将它们放置在 artifacts
目录中
$> 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
- it-generator:IT 生成器
- it-interfaces:用于处理接口类型的便捷结构
- it-json-serde:用于 IT 和 JSON 之间转换的 crate
- min-it-version:通过运行时维护 IT 和 SDK 的最小支持版本
- module-info-parser:模块清单和 SDK 版本的解析器
- module-interface:模块 IT 的解析器
- utils:一些实用函数和常量
- examples:几个主要用于测试的 Marine 示例
- fluence-faas:提供主机封装、IT<>JSON转换、日志记录、配置处理等功能的Fluence FaaS层
- fluence-app-service:提供服务运行基本API的Fluence应用程序服务层
- runtime:提供模块加载、卸载和调用基本功能的运行时层
- marine-js:旨在在浏览器中运行Marine的Web运行时层
- 工具
支持
如果您发现错误,请提交问题。您还可以通过Discord或Telegram联系我们。我们将尽力尽快解决问题。
贡献
任何感兴趣的人都可以为项目做出贡献。请确保您已阅读并遵守一些基本的规则。
许可
所有软件代码均为Fluence Labs, Inc.的版权所有(c),受Apache-2.0许可协议的约束。