借Serverless东风,WebAssembly在服务端无敌了?

前有科技后进阶 2024-05-08 05:10:37

大家好,很高兴又见面了,我是"高级前端‬进阶‬",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发,您的支持是我不断创作的动力。

1.什么是 Worker

Worker 在软件生态系统中有很多定义。 在 Web 平台的上下文中,Worker 是侦听事件并回复事件的资源,比如:接收 HTTP 请求并返回 HTTP 响应的脚本或函数。

可以组合多个 Worker 开发应用程序。 每个 Worker 都会监听某些事件并对其做出响应。 将大型应用程序拆分为较小的部分有几个好处:

更容易开发:Worker 规模较小且专注。更容易测试:每个 Worker 都可以单独进行测试,并且测试覆盖的面积更小。更易于部署:新平台专注于 Worker,部署现有应用程序只需一个命令。

无服务器计算是构建 Web 应用程序的流行模型,AWS Lambda 和 Google Cloud Functions 等服务实现了这种模型。

而 Workers 是 Serverless 的实现。 许多现有的 Serverless 平台在集中式基础设施中运行功能。 借助 Worker 模型,Cloudflare Workers®、Deno Deploy、Vercel、Fermyon、Suborbital 和 wasmCloud 等平台可将 Worker 部署在靠近用户的位置。 同时创建了一组新的 “边缘运行时” 能够在全球范围内快速分配 Worker。

2.什么是 Wasm Workers Server

Wasm Workers Server 是一个框架,允许开发者使用称为 “workers” 的轻量级构造来开发和运行 Serverless 应用程序。

服务器本身被实现为一个独立的二进制文件,将 HTTP 请求路由到托管 Worker 线程的 WebAssembly 运行时。其在给定文件夹中查找 .wasm 和其他兼容模块(例如 JavaScript 和 Python 文件),并根据其路径关联 HTTP 端点:

默认情况下,开发者也不需要配置任何内容。只需向 wws 提供项目位置就会识别 Weorkr 并开始服务请求。

总之,Wasm Workers Server 是 Worker 平台的轻量级实现,旨在实现兼容性。 开发者可以使用其在本地快速开发应用程序或将应用程序托管在完全可控的服务器上。

Wasm Workers Server 入门非常简单,只需下载二进制文件并开始编写工作程序。 同时,可以基于不同的语言创建,并借助 WebAssembly 安全地运行。旨在实现最大兼容性,并遵循不同公司以 WinterCG 名义工作的现行规范。 该工作组旨在创建一个通用 API,以便像浏览器之外的 Worker 一样使用 Web 平台 API。

需要注意的是,对 wws 的关注点是简单性和兼容性,因为这是一个不断发展的生态。

3.Wasm Workers Server 如何工作

Wasm Workers 围绕两个主要思想构建:

Workers 接收请求并返回响应:这是创建无服务器函数的广泛使用的模式,从而保持与多个平台的兼容性。工作人员通过 WASI Stdio 接收和返回数据:为了提高兼容性并简化与现有语言的集成,可以使用 STDIN / STDOUT 发送和接收数据。 因此,任何可以使用 WASI 标准编译的语言都可以创建与 Wasm Workers 兼容的 Workers。

基于以上两个原则,服务器执行以下任务:

识别给定文件夹中的 .wasm 模块和任何其他受支持的语言(例如 .js 和 .py)。将 HTTP 路由关联到每个模块。如果需要,创建一个键 / 值内存存储。初始化 Wasmtime 运行时启动 HTTP 服务器以开始处理请求。

Wasm Workers 假定来自文件系统的 HTTP 路由,与 NextJS 等其他项目非常相似。 从而通过运行而无需添加任何配置文件来简化服务器界面。

对于诸如键 / 值存储之类的额外功能,开发者只需要编写配置文件。 默认情况下,Wasm Workers 不会为任何 Worker 启用任何额外功能。 下面是一个为 Worker 启用键 / 值存储的示例配置文件:

// ./counter.tomlname = "counter"version = "1"[data][data.kv]namespace = "counter"4.Wasm Workers Server 的 JavaScript 支持

基于 JavaScript 的 Workers 可以通过 Wasm Workers Server 开箱即用,因为服务器集成了编译成 WebAssembly 模块的 JavaScript 解释器。目前,支持的解释器是基于 quickjs,不过也在努力添加新的解释器。

首先下载 wws:

curl -fsSL https://workers.wasmlabs.dev/install | bash

从 Wasm Workers Server 的存储库运行 js-basic 示例:

wws https://github.com/vmware-labs/wasm-workers-server.git -i --git-folder "examples/js-basic"

接着可以访问 http://localhost:8080。

JavaScript Worker 线程基于 Web Fetch API 中的请求 / 响应对象。 Worker 需要侦听 fetch 事件,其中将包含关联的 Request 对象。 Worker 函数将接收请求并生成 Response 对象来回复请求。

在下面例子中,Worker 将收到一个请求并打印所有相关信息。

首先,创建一个包含以下内容的新 index.js 文件。 这是订阅 fetch 事件并返回有效响应所需的最少代码。

const reply = (request) => { return new Response("Hello Wasm!");}// Subscribe to the Fetch eventaddEventListener("fetch", event => { return event.respondWith(reply(event.request));});

接着可以在 reply 方法中添加更多内容来显示请求信息。除此之外,下面还添加一个响应标头。

const reply = (request) => { // Body response const body = `<!DOCTYPE html> <body> <h1>Hello from Wasm Workers Server</h1> <p>Replying to ${request.url}</p> <p>Method: ${request.method}</p> <p>User Agent: ${request.headers.get("userAgent")}</p> <p>Payload: ${request.body || "-"}</p> <p> This page was generated by a JavaScript file inside WebAssembly </p> </body>`; // Build a new response let response = new Response(body); // Add a new header response.headers.set("x-generated-by", "wasm-workers-server"); return response;}// Subscribe to the Fetch eventaddEventListener("fetch", event => { return event.respondWith(reply(event.request));});

接着,保存文件并使用 wws 运行工作程序。

wws⚙️ Loading routes from: . Detected routes:- http://127.0.0.1:8080/=> index.js (name: default) Start serving requests at http://127.0.0.1:8080

Wasm Workers Server 除了支持 JS 外,还包括了对 Rust、Python、Ruby、Go 、Zig 等众多语言的支持,本文不再过多展开。

5.本文总结

本文主要和大家介绍 Wasm Workers Server ,其是一个框架,允许开发者使用称为 “workers” 的轻量级构造来开发和运行 Serverless 应用程序。

服务器本身被实现为一个独立的二进制文件,将 HTTP 请求路由到托管 Worker 线程的 WebAssembly 运行时。因为篇幅问题,关于 wws 只是做了一个简短的介绍,但是文末的参考资料提供了大量优秀文档以供学习,如果有兴趣可以自行阅读。如果大家有什么疑问欢迎在评论区留言。

参考资料

https://workers.wasmlabs.dev/docs/get-started/introduction

https://workers.wasmlabs.dev/docs/get-started/how-it-works

https://workers.wasmlabs.dev/docs/languages/javascript

https://blog.ttulka.com/webassembly-serverless-computing-from-scratch/

https://nigelpoulton.com/webassembly-on-kubernetes-everything-you-need-to-know/

0 阅读:0

前有科技后进阶

简介:感谢大家的关注