为什么 WebAssembly 即使在浏览器之外也是创新的

2021-08-09 02:59:41

2021 年 7 月 16 日 WebAssembly (Wasm) 在当今的云原生世界中有许多应用程序——WASI、边缘云计算、Proxy-Wasm 和用于无服务器功能的云原生运行时,仅举几例。问题是,为什么 WebAssembly 变得如此流行?为了回答这个问题,让我们先看看 WebAssembly 的基本属性。 WebAssembly 是一种安全、可移植且低级的二进制指令格式。详细说明 WebAssembly 的一些关键属性,它是: Open:这意味着它是可嵌入的。它具有与外部环境的可定制界面。例如,在 WASI 中,WebAssembly 可以运行在抽象的操作系统平台上。另一个例子是 Proxy-Wasm:Wasm 模块与外部代理应用程序通信以操纵或处理 HTTP、UDP 或 TCP 流量等流量。显然还有其他现有解决方案可以实现与 WebAssembly 类似的目标,但正如我们将看到的,这些解决方案中的每一个都有一定的局限性:NaCI 是 Google 的软件故障隔离 (SFI) 解决方案。它是安全的、可嵌入的和多语言的。它可以通过应用 SFI 技术运行不受信任的代码。然而,由于 NaCl 是基于原生二进制的,所以它不是一个可移植的解决方案。 eBPF 是一个安全的、可嵌入的、可移植的程序,主要用于内核。然而,由于其严格的限制,它几乎不是多语言的。

Java 是一种通用语言,可以在任何地方运行。缺点是孤立的实体不是 Java 的一等公民。因此,这些替代解决方案都没有展示 WebAssembly 中体现的所有属性。另一方面,WebAssembly 与 Java 一样可移植,与 NaCl 或 Seccomp 一样安全,与 Lua 一样可嵌入,并且与 Native Library 一样多语言。与市场上现有的解决方案相比,WebAssembly 是一个出色的新解决方案,其设计全面,旨在同时满足多个目标。虽然其他现有解决方案在某些方面缺乏,但 WebAssembly 是一个成功的解决方案,可以实现其他解决方案无法实现的目标。综上所述,WebAssembly 的独特优势使其在云原生世界中脱颖而出。与 Linux 中可执行文件的对象格式 Executable and Linkable Format (ELF) 一样,WebAssembly 也是一种对象格式。由于 Linux 定义了可执行文件可以使用哪些 API,因此外部 Wasm 嵌入式接口定义了由 Wasm 模块导入/导出的函数和符号。这产生了 WebAssembly 的各种接口类型。由于以下原因,在应用程序中嵌入 WebAssembly 很重要。首先,WebAssembly 为应用程序提供了安全的可扩展性机制。其次,应用程序和 Wasm 模块通过双向 ABI 和 API 进行通信。最后,WebAssembly 允许用户以任何语言安全、便携地安装扩展。 Wasm 嵌入式接口的两个主要示例是:WebAssembly for Proxies (Proxy-Wasm) 和 WASI 可执行接口。出于本文的目的,让我们关注 Proxy-Wasm 的安全扩展机制。由 WebAssembly 提供支持,Proxy-Wasm 是代理服务器的可扩展接口。 Envoy 作为参考实现。 Proxy-Wasm 提供了一种安全且可移植的方式来操纵代理流量。在 WebAssembly 之前,Envoy 提供了静态 C++ 库作为其扩展机制。没有提供隔离,C++ 是唯一受支持的语言。因此,更新过去总是需要重建的扩展。

自从采用 WebAssembly 以来,Envoy 的扩展已经能够在隔离的环境中安全地运行。这种方法具有独立于语言的独特优势,并且完全支持动态加载扩展。 WebAssembly 为云原生应用程序带来了安全的可扩展性机制。 Envoy 和 Istio 为由 Proxy-Wasm 提供支持的应用程序网格提供安全的可扩展性机制。使用 WebAssembly,您可以编写 Envoy 扩展,例如自定义授权和身份验证,以及日志记录。 WebAssembly 无与伦比的可嵌入性、安全性、多语言和可移植性同时导致了各种 Wasm 接口的开发。正如我们所见,通常在这些接口中可以找到安全的可扩展性机制。代理的可扩展性机制 Proxy-Wasm 是一个很好的例子,它允许用户安全地扩展他们的应用程序网格。凭借其独特的优势,WebAssembly 肯定会继续为云原生环境带来新的安全可扩展性机制。本文基于 Tetrate 工程师 Takaya Saeki 为 2021 年欧盟云原生 Wasm 日所做的赞助主题演讲。