时间:2023-08-08 13:45:21 点击次数:6
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!
高级前端进阶
前言
本文主要和大家介绍 Wasmer 宣布推出的 WCGI,即WebAssembly + CGI(Common Gateway Interface)。在年初,我也确实使用 WebAssembly 将客户端应用成功移植到了 Web,这也是为什么我一直对 WebAssembly 充满好奇的原因。我甚至在头条上开了一个合集《WebAssembly 前沿技术》来专门探讨 WebAssembly ,并将持续关注 WebAssembly 的最新动态。
下面是已发布部分文章传送门(更多文章可以阅读我的头条专题):
《 2023 年让 WebAssembly 大火的 10+应用!》《 万字长文!2023 年 WebAssembly 各个运行时性能对比!》《 让 JavaScript 在 WebAssembly 上加速运行!》《全网最火的5+优秀 WebAssembly 运行时!》正如大家所看到的,当我们还在迟疑是否要在日常开发中引入 WebAssembly 的时候,很多优秀的应用、工具已经开始吃 WebAssembly 的红利了,而且取得了不错的成就,这可能也是为什么各个浏览器厂商、开发者如此热衷 WebAssembly 的原因吧。
今天给大家带来的是Wasmer 宣布推出的 WCGI,即 WebAssembly + cgi!话不多说,直接开始进入正题!
1.什么是 WSGI
WSGI (Web Server Gateway Interface)是指 Web 服务器网关接口, 当部署 Django 或 Flask 应用程序时,WSGI 起着至关重要的作用。
Django: 是使用 Python 语言开发的一款免费而且开源的 Web 应用框架。由于 Python 语言的跨平台性,所以 Django 同样支持 Windows、Linux 和 Mac 系统。 Flask:是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 ,基于 BSD 授权WSGI 是描述 Web 服务器与 Python Web 应用程序或框架之间通信的规范。 它解释了 Web 服务器如何与 Python Web 应用程序、框架通信,以及如何链接 Web 应用程序/框架以处理请求。
Python 标准 WSGI 已经在 PEP 3333 中进行了详细的解释。本文将讨论什么是 WSGI 并深入研究 WSGI ,了解 WSGI 是如何工作的。
上图展示了 Django 项目中的 wsgi.py 文件。
2.WSGI 如何工作
假设有一个场景,开发者有一个使用 Django 或 Flask 应用程序开发的 Web 应用程序,如下图所示。
由于 Web 应用程序部署在 Web 服务器中,下图表示从各种用户获取请求的 Web 服务器。
上面的 web 服务器可以是 Apache、NGINX 等服务器,负责处理各种静态文件和缓存。此外,如果愿意扩展多个应用程序,还可以将服务器用作负载均衡器。现在出现了一个问题,即 Web 服务器如何与 Python 应用程序交互?
此时需要一个中介来执行 Web 服务器和 Python 应用程序之间的交互。 因此,Web 服务器与 Python 应用程序之间进行通信的标准是 WSGI。
现在,Web 服务器能够发送请求或与 WSGI 容器通信。 同样,Python 应用程序提供了一个“可调用”对象,其中包含由 WSGI 应用程序调用的某些功能,这些功能是根据 PEP 3333 标准定义的。 因此,有多个 WSGI 容器可用,例如 Gunicorn、uWSGI 等。
下图表示 Web 服务器、WSGI 和 Python 应用程序之间进行的通信过程。
目前有多个可用的 WSGI 容器,只需要在项目中安装一个 WSGI 容器,以便 Web 服务器可以与 WSGI 容器通信,该 WSGI 容器进一步与 Python 应用程序通信并提供相应的响应。 最后,当 Web 服务器获得响应时,将其发送回 Web 浏览器/用户。
目前 WSGI 服务器的可用实现包括:Gunicorn (Green Unicorn)、uWSGI、mod_wsgi、CherryPy 等等。
3.WCGI 的推出 挑战 WSGI 3.1 推出 WCGI 的 Wasmer 介绍
Wasmer 是在非浏览器上下文中运行 Wasm 的一种方式,提供基于 WebAssembly 的超轻量级容器。专注于支持在任何平台上运行 WASM 代码,为其他跨平台运行时(例如 Java)提供了潜在的替代方案。
Wasmer 在 Github 上将自己描述为“一个快速且安全的 WebAssembly 运行时,它使超轻量级容器可以在任何地方运行:从桌面到云、边缘和物联网IOT设备”。
Wasmer使用熟悉的工具和喜欢的语言,将所有内容编译为 WebAssembly。可以在任何操作系统上运行它或将其嵌入到其他语言中。Wasmer的主要特征包括:
默认安全: 除非明确启用,否则不能访问文件、网络或特定环境开箱即用地支持 WASI(WebAssembly System Interface) 和 Emscripten快速: 以接近本机的速度运行 WebAssembly语言支持:可嵌入多种编程语言,包括:Rust、C、C++、C#、D、Python、JS、Go、PHP、Ruby、Java、R、Postgres、Swift、Zig、Dart、Crystal、Lisp、Julia、VLang、Ocaml等几乎所有的主流语言符合最新的 WebAssembly 提案(SIMD、引用类型、线程等)Wasmer由Rust编写,目前在Github上有14.6K的star、600+ fork、超过4.9K的项目使用。
3.2 Wasmer 推出的 WCGI 到底是什么
CGI 与每个 HTTP 请求执行程序的目标保持一致,这使其脱颖而出。 在无服务器环境中的可扩展性和延迟方面,CGI 可以胜过许多其他解决方案,例如: Python/Ruby 或 NodeJS 中的 WSGI。
而 WCGI(WebAssembly + CGI)由 Wasmer 宣布推出,通过采用 WCGI,那些寻求在服务器端开发中实现更高效率、安全性和灵活性的人可以真正从这种方法中受益。WCGI 本质上是一种结合了 WebAssembly 的强大功能与 CGI 的多功能性和简单性的技术。WCGI 与其他方案相比,具有以下显著优势:
通过将现有的 CGI 应用程序编译为 WASI(AssemblyScript、C、C++、Go、PHP、Python 等)来重用代码逻辑发送仅包含业务逻辑和静态资产的超小包,没有 HTTP 堆栈或笨重的 Docker 容器完全沙盒执行:WebAssembly 代码在沙盒中运行,每个请求一个独立的实例4.使用 Rust 创建 WCGI 应用程序使用 Rust 创建 WCGI 应用程序,首先将 cgi crate 添加为 Cargo.toml 文件中的依赖项:
$ cargo add cgi
接下来,编写 Rust 服务器,如下例所示:
// src/lib.rs文件内容 use cgi::{http::StatusCode, request, Response}; fn main() { cgi::handle(handler); } fn handler(request: Request) -> Response { let who = String::from_utf8_lossy(request.body()); let who = if who.trim().is_empty() { "World" } else { who.trim() }; cgi::text_response(StatusCode::OK, format!("Hello, {who}!")) }
编写实现后,将其编译为 wasm32-wasi 目标。如果没有安装 WASI 目标,需要安装它(rustup target add wasm32-wasi)。
$ cargo build --target wasm32-wasi --release
创建一个 wasmer.toml 文件来描述包并包含 wasmer CLI 将执行的 WCGI 命令。
// 描述文件 [package] name = "wasmer/wcgi-rust-template" version = "0.1.0" description = "A template for WCGI applications" license = "MIT OR Apache-2.0" readme = "README.md" repository = "https://github.com/wasmerio/wcgi-rust-template" [[module]] name = "server" source = "target/wasm32-wasi/release/wcgi-rust-template.wasm" abi = "wasi" [[command]] name = "server" runner = "wcgi" module = "wcgi" annotations = { wcgi = { dialect = "rfc-3875" } }
现在可以启动服务器并浏览到 http://localhost:8000/ 以查看它的运行情况:
$ wasmer run-unstable .
应用初始界面如下图所示:
如果是PHP环境可以借助于 PHP-CGI ,它最先由 Rafael Fernández López 提出。由于他将原始版本的 php-cgi 编译为 WebAssembly 和 WASI,Wasmer 现在可以使用 WCGI 运行 PHP 网站,更多使用示例可以参考文末资料。
5.本文总结
本文主要和大家介绍下Wasmer 宣布推出的WCGI,即 WebAssembly + CGI!文章从什么是 WSGI、WSGI 如何工作、WCGI 挑战 WSGI、使用 Rust 创建 WCGI 应用程序等多个方面逐步铺开。
因为篇幅有限,文章并没有过多展开,如果有兴趣,可以在我的主页继续阅读,同时文末的参考资料提供了大量优秀文档以供学习。最后,欢迎大家点赞、评论、转发、收藏!
参考资料
https://medium.com/analytics-vidhya/what-is-wsgi-web-server-gateway-interface-ed2d290449e
https://wsgi.readthedocs.io/en/latest/what.html
https://www.oschina.net/news/235914/announcing-wcgi
https://wasmer.io/posts/announcing-wcgi
http://c.biancheng.net/view/7284.html
https://baike.baidu.com/item/Flask/1241509?fr=aladdin