docker web程序本地化_WebAssembly 起于web,不止于web

随着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)登场了。

5eb165c18c1eee0fed9fe55366edcc32.png

WASI代表WebAssembly系统接口。这是由Wasmtime项目设计的API,可提供对几种类似操作系统的功能的访问,包括文件和文件系统,Berkeley套接字,时钟和随机数,我们将对此进行标准化。
它被设计为独立于浏览器,因此它不依赖于Web API或JS,并且不受与JS兼容的需求的限制。而且它具有基于功能的集成安全性,因此将WebAssembly的特征沙箱扩展为包括I / O。

WebAssembly有两个优势:

  • 可移植性。WebAssembly能够编译一次并跨一大堆不同的机器运行,产生可移植的二进制文件。

9e072165859c6014a7717ee91115edd6.png

这种可移植性使向用户分发代码变得更加容易。
例如,如果Node的本机模块是用WebAssembly编写的,则用户在安装带有本机模块的应用程序时无需运行node-gyp,并且开发人员无需配置和分发数十个二进制文件。

  • 安全性。WebAssembly通过沙箱实现安全。

这意味着代码无法直接与操作系统对话。但是,它如何处理系统资源呢?主机(可能是浏览器,也可能是wasm运行时)将函数放入代码可以使用的沙箱中。
这意味着主机可以限制程序可以执行的操作。它不仅可以让程序代表用户执行操作,还可以在用户完全权限下调用任何系统调用。

f60081356ea3096e35f0e936c9564169.png

也许这个时候,大家还没有体会到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 是如此的美好。

6e1399a6e0d7299c521df4762080beab.png

不过目前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承载了太多人的期待,我等只能跟着技术发展的趋势乘风破浪。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值