在 Rust 中加载外部 Web 组装模块

Rust 和 Web 组装

简介

这是三部分系列中的第 2 部分。如果您还没有,请在阅读本部分之前阅读第 -1 部分。

我们在 Part-1 中构建了一个非常简单的 Web Assembly 模块。现在我们需要找到一种方法来分发它。输入 wasm-to-oci。 我们将看看如何加载外部 Web 组装模块。

先决条件

1.锈(1.60+)

  1. 码头工人

3.CNCF 分布

4.wasm-to-oci

WASM-TO-OCI

OCI 代表 Open Ccontainer Initiative。 Wasm-To-OCI 是使用 OCI 注册中心来分发 Web 组装模块。 OCI 注册表是符合 OCI 注册表工件规范的任何注册表。

ORAS(OCI Registry As Storage) 是 OCI 工件项目的实现。它简化了将内容存储到 OCI 注册表的过程。使用 ORAS 客户端库可以轻松地将 WASM 模块推送和拉取到 OCI 注册表。根据 ORAS 文档,目前以下注册表支持 OCI 工件

  • CNCF 分发— 本地/离线验证

  • Azure 容器注册表

  • Amazon Elastic Container Registry

  • Google Artifact Registry

  • GitHub Packages 容器注册表

  • 捆扎条

对于我们的用例,我们将使用未经身份验证的本地 CNCF 分发。

CNCF 分布

CNCF 分发是OCI 分发规范的参考实现。在本地运行分发,作为容器,提供 ORAS 和OCI Artifacts的本地/离线验证。

- ORAS 文档

要启动本地分发实例,请运行以下命令

#!/bin/bashdocker run -it --rm -p 5000:5000 注册表

注意:您需要运行 docker daemon 才能成功执行此命令。

如果一切顺利,那么您应该会看到类似

泊坞窗运行注册表

推送到 OCI 注册表

现在我们已经启动了我们的注册表。是时候将我们的 Web 程序集推送到这个 OCI 注册表了。

从我们的Part-1我们将在 ./target/wasm32-wasi/debug/level1.wasm 中拥有 WASM 文件。 在您继续之前,请确保您拥有wasm-to-ocicli安装在你的机器上。

将以下行添加到您的 justfile

./justfilepush sample:wasm-to-oci push target/wasm32-wasi/debug/{{sample}}.wasm localhost:5000/wagi-{{sample}}-oci:latest

添加此行后,justfile 将如下所示:

只是文件快照

保存更改后,运行以下命令以推送到本地注册表。

#!/bin/bash 只需推送 1 级

如果一切顺利,你应该看到

WASM 推送到 OCI Registry

现在我们已将您的 Webassembly 推送到您的注册表。是时候在另一个项目中使用它了。

加载外部模块

现在编辑 modules.toml 文件并添加以下行

/modules.toml[[模块]]

路线 u003d "/ping-oci"

模块u003d“oci:本地主机:5000 / weights-level1-oci:最新”

添加此行后,您的 modules.toml 文件应如下所示:

模块.toml

在此之后,让我们通过运行启动 level1

#!/bin/bash 只运行级别 1

现在转到您的浏览器并导航到http://localhost:3000/ping-oci,如果一切顺利,您应该看到

ping-oci

你看看那个。我们得到了来自外部的 WASM 的响应,就像那样。

让我们看一下网络选项卡

网络选项卡

请注意,响应与我们从本地 WASM-WAGI ping 得到的响应相同,即

网络选项卡 — 本地 wagi

哇!我们能够在没有任何库的情况下加载外部 Web 组装模块。这个外部 WASM 在沙箱中运行,无法访问我们的文件系统或任何东西。 WAGI 服务器运行此代码并以“pong”响应。

在下一部分中,我们将了解如何将此 Web 程序集部署到 Kubernetes 集群。

参考文献

WAGI简介 |幻灯片 + 报道 (fettblog.eu)

https://youtu.be/9NDwHBjLlhQ— 非常有用的视频和对本文的主要影响

deislabs/wagi:用最少的工作量在 WebAssembly 中编写 HTTP 处理程序 (github.com)

Wasm、WASI、Wagi:它们是什么? | Fermyon Technologies (@FermyonTech)

thangchung/webassembly-tour: ⚙️ 带你参观 WebAssembly(WASI 上的 WASM 目标)和 wasmCloud、Krustlet、WAGI 等。🌟 如果你喜欢它,请给它一颗星。 (github.com)

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐