48 个版本 (15 个重大变更)
0.20.1 | 2024年6月5日 |
---|---|
0.19.7 | 2024年2月22日 |
0.19.0 | 2023年12月14日 |
0.18.0 | 2023年11月7日 |
0.6.10 | 2021年7月14日 |
#850 在 魔法豆
每月下载量:76
140KB
2.684K SLoC
海洋
海洋是一个基于 组件模型 的现代通用 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;
}
}
在本海洋(Wasm)模块(及命名空间)shrek
中,我们声明了一个函数greeting
,它从donkey
模块的(3)greeting
函数中创建了一个donkey_greeting
(1),而该函数本身依赖于导入donkey
Wasm模块,通过Rust的FFI(4)link
从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
模块被称为门面模块,遵循门面模式,每个服务只能有一个门面模块。
请确保您已安装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转换、记录器、配置处理等功能的开源FaaS层
- fluence-app-service:提供一个基本API的Fluence应用服务层,用于服务运行
- runtime:提供加载、卸载和调用模块基本功能的运行时层
- marine-js:一个针对浏览器运行Marine的Web运行时层
- 工具
支持
如果您发现了一个错误,请提交问题。您也可以在Discord或Telegram上联系我们。我们将尽力尽快解决问题。
贡献
任何感兴趣的人都可以为该项目做出贡献。请确保您阅读并遵守一些基本的规则。
许可证
所有软件代码均为Fluence DAO版权所有,并受AGPLv3许可证的约束。
依赖关系
~16–30MB
~488K SLoC