11 个版本 (4 个破坏性更新)
0.19.0 | 2021 年 8 月 27 日 |
---|---|
0.18.2 | 2021 年 5 月 13 日 |
0.18.1 | 2021 年 4 月 29 日 |
0.17.0 | 2021 年 4 月 13 日 |
0.15.0 | 2021 年 2 月 16 日 |
#11 在 #wapc
每月 413 次下载
在 wasmcloud 中使用
1.5MB
10K SLoC
⚠️ 已废弃
此包,wasmCloud 主机的 Rust 运行时,已废弃,转而使用更新的 OTP 运行时。保留 Rust 运行时是为了帮助人们从 0.18 版本过渡到 0.50 版本时作为参考,但这些文件最终将被删除。
wasmCloud 主机
wasmCloud 是一个安全、分布式的角色平台,拥有一个用于连接不同基础设施的自主导航网络。
lib.rs
:
wasmCloud 主机
wasmCloud 是一个用于编写可移植业务逻辑的平台,可以在从边缘到云端的任何地方运行,它提供默认安全、无样板代码的开发体验,具有快速反馈循环。
wasmCloud 团队相信我们不仅能够改变开发者构建软件的方式,还能够使软件的加密、部署、维护、监控和升级更加容易,同时减少我们需要复制粘贴的样板代码量。
wasmCloud 是围绕以下核心原则设计的
- 生产力 - 开发者和运营
- 企业级安全
- 节省成本
- 可移植性
- 性能
在从概念到生产的整个过程中,您不需要更改设计、架构或编程环境。wasmCloud 致力于在保留企业级功能的同时,给分布式系统开发带来快乐。
角色
WasmCloud的actor设计灵感来源于actor模型,尽管一些实现细节可能与人们从某些actor运行时中期望的不同。wasmCloud actor是一个单线程、可移植的计算和部署单元。
我们的actor还包含通过声明断言任何actor被授予访问权限的能力列表的密码学签名JSON Web Tokens (JWT)。有关更多信息,请参阅我们的安全文档。
能力
actor作为独立的(非WASI)WebAssembly模块,不能与操作系统交互,也不能执行任何类型的I/O。因此,如果actor想执行除了纯计算之外的其他操作,它必须通过能力提供者来实现,这是由wasmCloud宿主运行时加载的动态插件,并为actor提供安全的调度。
使用宿主API
此crate提供了与宿主运行时交互的primary API
。如果您只想使用“标准”二进制文件运行actor工作负载并使用标准功能与能力提供者通信,则应使用可安装的wasmCloud二进制文件。
另一方面,如果您有兴趣提供自己的宿主运行时,该运行时利用wasmCloud宿主API作为平台,则此crate是您需要的。
要启动运行时,只需构建一个宿主,然后向其中添加actor、能力和链接定义。有关更多信息,请参阅wasmcloud.dev上的文档和教程。
宿主API示例
以下示例创建了一个默认的独立(无lattice/单玩家)模式的wasmCloud宿主。然后加载一个actor,该actor将传入的HTTP请求作为JSON对象回显为出站HTTP响应的正文。
加载了HTTP服务器能力提供者,以便actor可以接收Web请求。HTTP服务器能力提供者和actor之间需要一个链接定义,以验证actor权限和提供配置值(如要监听的端口)。此链接定义可以在actor和能力提供者启动之前或之后建立,因为链接定义是lattice中缓存的一等数据。
use wasmcloud_host::{HostBuilder, Actor, NativeCapability};
use std::collections::HashMap;
use std::error::Error;
use std::time::Duration;
use actix_rt::time::sleep;
use reqwest;
const WEB_PORT: u32 = 8080;
#[actix_rt::main]
async fn main() -> Result<(), Box<dyn Error + Sync +Send>> {
let h = HostBuilder::new().build();
h.start().await?;
let echo = Actor::from_file("../../tests/modules/echo.wasm")?;
let actor_id = echo.public_key();
h.start_actor(echo).await?;
// Read a cross-platform provider archive file
let arc = par_from_file("../../tests/modules/httpserver.par.gz")?;
let websrv = NativeCapability::from_archive(&arc, None)?;
let websrv_id = websrv.id();
let mut webvalues: HashMap<String, String> = HashMap::new();
webvalues.insert("PORT".to_string(), format!("{}", WEB_PORT));
// Establish a link between the actor and a capability provider
h.set_link(
&actor_id,
"wasmcloud:httpserver",
None,
websrv_id,
webvalues,
)
.await?;
// Start the web server provider (which auto-establishes the link)
h.start_native_capability(websrv).await?;
// Let the web server start
sleep(Duration::from_millis(500)).await;
let url = format!("https://127.0.0.1:{}/demo?test=kthxbye", WEB_PORT);
let resp = reqwest::get(&url).await?;
assert!(resp.status().is_success());
let v: serde_json::Value = serde_json::from_slice(&resp.bytes().await?)?;
assert_eq!("test=kthxbye", v["query_string"].as_str().unwrap());
Ok(())
}
依赖项
~32–51MB
~1M SLoC