#capability-provider #wasmcloud #actor #actor-model #wapc #api-bindings

废弃 wasmcloud-host

一个安全、分布式的 WebAssembly 角色模型运行时。为了 https://github.com/wasmCloud/wasmcloud-otp 而废弃。

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

Download history 122/week @ 2024-03-15 56/week @ 2024-03-22 90/week @ 2024-03-29 110/week @ 2024-04-05 111/week @ 2024-04-12 39/week @ 2024-04-19 89/week @ 2024-04-26 83/week @ 2024-05-03 66/week @ 2024-05-10 31/week @ 2024-05-17 57/week @ 2024-05-24 76/week @ 2024-05-31 182/week @ 2024-06-07 53/week @ 2024-06-14 114/week @ 2024-06-21 44/week @ 2024-06-28

每月 413 次下载
wasmcloud 中使用

Apache-2.0

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