随着web的发展,web应用日益复杂,渐渐暴露出了 JavaScript 的问题:
- 语法太灵活导致开发大型 Web 项目困难;
- 性能不能满足一些场景的需要。
WebAssembly应运而生。在技术圈有一个梗:说翻阅技术史,破天荒地第一次,苹果(safari),谷歌(chrome),微软(ie or edge),火狐(firefox)4家公司聚在一起合谋一件大事--WebAssembly。由此可以看出,WebAssembly是一出生就自带光环。
WebAssembly 是一种新的字节码格式,主流浏览器都已经支持 WebAssembly。 和 JS 需要解释执行不同的是,WebAssembly 字节码和底层机器码很相似可快速装载运行,因此性能相对于 JS 解释执行大大提升。 也就是说 WebAssembly 并不是一门编程语言,而是一份字节码标准,需要用高级编程语言编译出字节码放到 WebAssembly 虚拟机中才能运行,浏览器厂商需要做的就是根据 WebAssembly 规范实现虚拟机。
WebAssembly 磨平了不同CPU架构,支持各种语言编写,然后由llvm编译成机器码。听起来有没有像JVM?
但是起于web的WebAssembly,目标可不仅仅局限于web。随着发展,把目光瞄向了服务器端。
此时主角-- WebAssembly system interface(wasi)登场了。
WASI代表WebAssembly系统接口。这是由Wasmtime项目设计的API,可提供对几种类似操作系统的功能的访问,包括文件和文件系统,Berkeley套接字,时钟和随机数,我们将对此进行标准化。
它被设计为独立于浏览器,因此它不依赖于Web API或JS,并且不受与JS兼容的需求的限制。而且它具有基于功能的集成安全性,因此将WebAssembly的特征沙箱扩展为包括I / O。
WebAssembly有两个优势:
可移植性
。WebAssembly能够编译一次并跨一大堆不同的机器运行,产生可移植的二进制文件。
这种可移植性使向用户分发代码变得更加容易。
例如,如果Node的本机模块是用WebAssembly编写的,则用户在安装带有本机模块的应用程序时无需运行node-gyp,并且开发人员无需配置和分发数十个二进制文件。
安全性
。WebAssembly通过沙箱实现安全。
这意味着代码无法直接与操作系统对话。但是,它如何处理系统资源呢?主机(可能是浏览器,也可能是wasm运行时)将函数放入代码可以使用的沙箱中。
这意味着主机可以限制程序可以执行的操作。它不仅可以让程序代表用户执行操作,还可以在用户完全权限下调用任何系统调用。
也许这个时候,大家还没有体会到wasi的光辉。那么docker的核心作者曾经说过:
If WASM+WASI existed in 2008, we wouldn't have needed to created Docker. That's how important it is. Webassembly on the server is the future of computing. A standardized system interface was the missing link. Let's hope WASI is up to the task!
大意就是如果WASM+WASI 早点出现,压根没有docker什么机会了。docker的火爆我们已经体会到了。那么我们看看为什么WASM+WASI 可以替换掉docker?docker的优势在于镜像的分发(代码的分享,磨平了各种语言),隔离性(namespace和cgroup),而这两种正是wasi的优势,而且做的更好。沙箱的隔离方式,在安全性和隔离性上更胜一筹。
技术人从来不会满足于现状,总有一些先行者要吃螃蟹,于是 Krustlet 和 webassemblyhub 出现了。下面我们一一分析。
- Krustlet -- 用Rust编写的kubelet,可以在Kubernetes中运行WebAssembly工作负载。通过该组件,k8s具备了调度和编排wasm程序的能力。随着docker流行,越来越多的企业通过docker部署自己的应用,也逐步暴露了很多问题。可谓天下苦docker久亦。主要体现在安全性和隔离性上,所以导致了业界又开发了很多kata container类似的runv容器,一个个虎视眈眈盯着docker。
- webassemblyhub -- 有没有一种dockerhub的熟悉感?WebAssembly Hub是社区共享和使用WebAssembly Envoy扩展的hub。可以轻松搜索并找到符合您要添加功能的扩展,然后尝试一下。只不过该hub目的是为envoy扩展服务的。但是足以体现出wasm程序的分发的便捷性。
再加上前面讲过的各种语言编写,各种平台运行
,看起来wasi 是如此的美好。
不过目前wasm和wasi还处于高速发展当中,除了一些极客公司,普罗大众还是很难在生产环境使用的。
接下来,我们通过一个小demo,给大家演示一下,如何通过rust编写一个wasm程序,然后通过上一篇文章中介绍的wasmtime这个运行时直接运行wasm程序。
首先我们创建cargo工程,
$ cargo new hello-world
$ cd hello-world
在src/main.rs文件中,您将看到规范的Rust 使用println!宏输出 “ Hello,World!”。我们将对wasm32-wasi目标执行此操作:
cargo wasi run
Finished dev [unoptimized + debuginfo] target(s) in 0.05s
Running `/Users/iyacontrol/.cargo/bin/cargo-wasi target/wasm32-wasi/debug/hello-world.wasm`
Running `target/wasm32-wasi/debug/hello-world.wasm`
Hello, world!
而且我们已经在wasmtime内运行了我们的第一个WebAssembly代码!
您也可以自己运行wasmtime:
wasmtime target/wasm32-wasi/debug/hello-world.wasm
Hello, world!
一种docker run的既视感。
起于web,不止于web。太多的领域,需要wasm,比如边缘计算。wasm承载了太多人的期待,我等只能跟着技术发展的趋势乘风破浪。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。