首页 > 编程语言 >如何在 Go 语言开发的宿主程序中嵌入 WebAssembly

如何在 Go 语言开发的宿主程序中嵌入 WebAssembly

时间:2023-01-28 10:36:35浏览次数:42  
标签:WebAssembly 嵌入 宿主 Web wasmtime 程序 Go Docker

​​如何在 Go 语言开发的宿主程序中嵌入 WebAssembly​​


在 WebAssembly的官方定义中,​​for a stack-based virtual machine​​​ 这句话也值得关注,因为它引领了 WebAssembly 这一原本为 Web 设计的技术(名字中就包含了​​Web​​一词),最终进入后端领域。

这是因为,从早期的 VMWare WorkStation、VirtualBox,到今天的 Docker,虚拟化技术一直是云计算的基础。 因此,作为一种具有诸多优势的虚拟机代码格式,WebAssembly 进入后端应用领域是必然趋势。 Docker 创始人 Solomon Hykes 在 2019 年表示:

如果 WASM+WASI 在 2008 年就存在,我们就不需要创建 Docker

可见 WebAssembly 在后端应用中确实具有广阔的应用前景。

当然,Solon Hykes 表示,他的意思并不是稍后 ​​WebAssembly 将取代 Docker​​.

这也是当今业界普遍的看法:​​WebAssembly 和 Docker 各有优势,相得益彰​​。 具体来说:

  • WebAssembly 程序的大小通常在 1M 左右,而 Docker 镜像往往很容易超过 100M,因此 WebAssembly 的加载速度要快得多。
  • WebAssembly 程序的冷启动速度比 Docker 容器快约 100 倍。
  • WebAssembly 运行在沙箱中,任何与外界的交互都需要获得明确的许可后才能进行,安全性极佳。
    WebAssembly 模块只是一个二进制程序,不包含操作系统环境,所以它不能像我们在 Docker 中那样编译后执行。

如下图所示,无论是 Web 应用还是非 Web 应用,我们都需要在宿主程序中嵌入WebAssembly Runtime(运行时)才能使用 WebAssembly.

唯一不同的是,在 web 应用中,宿主程序是浏览器,而在非 web 场景中,宿主程序是我们自己的应用,具体到后端应用,宿主程序则是我们的后端服务。

如何在 Go 语言开发的宿主程序中嵌入 WebAssembly_Docker

目前可用的 WebAssembly 运行时包括 Wasmtime、WasmEdge、WAVM、Wasmer 等,各有优缺点。

下面以 Wasmtime 为例,介绍如何在 Go 语言开发的宿主程序中嵌入 WebAssembly.

嵌入 WebAssembly 运行时和实例化 WebAssembly 模块非常简单,如果省略错误处理,下面几行代码就可以完成所有这些工作。

func createWasmVM(code []byte) {
engine := wasmtime.NewEngine()
module, _ := wasmtime.NewModule(engine, code)
store := wasmtime.NewStore(engine)
linker := wasmtime.NewLinker(engine)
inst, _ := linker.Instantiate(store, module)
_ = inst
}




2023-01-23 21:59  ​​JerryWang_汪子熙​​ 

标签:WebAssembly,嵌入,宿主,Web,wasmtime,程序,Go,Docker
From: https://blog.51cto.com/jerrywangsap/6024732

相关文章

  • Django3 使用xadmin
    xadmin下载地址:https://github.com/vip68/xadmin_bugfix下载完之后解压,只需要把里面的xadmin文件夹和requirements.txt文件复制到项目根目录下,然后在终端执行pipinstall......
  • PHP转Go实践:xjson解析神器「开源工具集」
    前言近期会更新一系列开源项目的文章,新的一年会和大家做更多的开源项目,也欢迎大家加入进来。xutil今天分享的文章源自于开源项目jinzaigo/xutil的封装。在封装过程中......
  • PyCharm配置Django多个setting文件
    django项目设置多个setting文件时,pycharm会少了很多代码补全提示,对于我这种新手很不方便,经过一番折腾,总结了一些小经验1.PyCharm-->设置-->语言和框架-->Django-->启用Dj......
  • Ubuntu install golang
    goversionaptinstallgolang=1.19aptinstallgolang=1.18aptinstallgolang-1.19-goaptinstallgolang-1.18-goaptremovegolangaptremovegolang-1.13-go......
  • 11--go mod遇到的小问题 | 青训营笔记
    这是我参与「第五届青训营」伴学笔记创作活动的第11天gopath不起作用 cannotfindmoduleprovidingpackagegithub.com原因:使用代理下载go包后后,出现了找不到包......
  • Mongo集群安装-Docker环境
    安装简介本文主要介绍了在Docker环境下如何安装Mongo集群的过程,Mongo集群采用单分片三副本模式进行部署。服务器:bigdata1、bigdata2、bigdata3部署服务:config-server、shard......
  • django rest
    djangorest框架是今天看的一个文档。比较简单的是入门篇,​​​https://github.com/moocstudent/django-proj​​​这个呢就是根据入门篇来的代码,其中比django原教程多的......
  • Golang实现16/32位MD5加密
    ​​Golang实现16/32位MD5加密​​packagemainimport("crypto/md5""encoding/hex""fmt")//返回一个32位md5加密后的字符串funcGetMD5Encode(datastring)string{......
  • 电脑上多个golang版本如何自由切换(转)
    电脑上多个golang版本如何自由切换电脑上安装了多个golang版本,如何进行切换,在网上也没找到实际可行的解决办法,所以决定写一下解决方案。当然有一种笨方法就是直接删掉多余的......
  • MongoDB 基础(二)mongodb 与 T-SQL 对比
    SQLTerms/ConceptsMongoDBTerms/ConceptsdatabasedatabasetableCollection(集合)rowdocument(文档)columnKey(键)ValueValue(值)indexindextablejoinsembeddeddocumentsandlin......