最新要闻
- 焦点关注:重磅!亚洲最大推力液体火箭发动机试车台调试完成
- 视焦点讯!堆料最足超大杯!小米13 Ultra确认可变光圈+全焦段四摄
- 全优大七座SUV!全新一代揽月正式上市 18.99万元起售
- 环球最新:2人观影全程用手机录制电影内容 目击者:中途还换了一个手机
- 米哈游《崩坏星穹铁道》姬子角色PV:成熟妩媚的大姐姐
- 今日快讯:“算力中国行”大型调研采访活动启动,将深入各地了解算力应用发展情况
- 播报:ChatGPT消除无聊的工作 诺奖得主:人类上四休三就靠AI
- 对标特斯拉Model Y 小鹏G6再放送 博主:兴奋起来吧、有电动尾翼
- 《名侦探柯南:黑铁的鱼影》新宣传图 成人版灰原哀太劲爆
- 精彩看点:第三次!沈腾主演《满江红》宣布密钥再次延期:上映至5月15日
- 亚马逊安抚员工:公司并没有在AI竞争中落下
- 天天微资讯!私募巨头阿波罗:美国信贷紧缩已开始
- 全球新资讯:一代“金牌配角” 中国香港知名演员吴耀汉去世:终年83岁
- 世界热消息:单核性能猛增68% 龙芯确认下代CPU性能达市场主流水平
- 【全球速看料】已做到笔记本电脑大小 国产量子计算机再进化:三大产品升级
- 环球信息:撞脸苹果!金立发布F1 Plus手机:刘海屏设计 国产8核CPU
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
环球今头条!WebAssembly 助力云原生:APISIX 如何借助 Wasm 插件实现扩展功能?
本文将介绍 Wasm,以及 Apache APISIX 如何实现 Wasm 功能。
作者朱欣欣,API7.ai 技术工程师
(相关资料图)
原文链接
什么是 Wasm
Wasm 是 WebAssembly 的缩写。WebAssembly/Wasm 是一个基于堆栈的虚拟机设计的指令格式。在 Wasm 未出现之前,浏览器中只能支持运行 Javascript 语言。当 Wasm 出现之后,使得高级语言例如 C/C++/Golang 能够在浏览器中运行。当前,主流的浏览器包括 Chrome、Firefox、Safari 等浏览器都已完成对 Wasm 的支持。并且得益于 WASI 项目的推进,服务端也已经能够支持运行 Wasm 指令。如今在网关侧,Apache APISIX 也已完成对 Wasm 的支持,开发者可以通过高级语言 C/C++/Go/Rust 并按照 proxy-wasm 规范来完成 Wasm 插件的开发。
为什么 APISIX 要支持 Wasm 插件
相比较原生的 Lua 插件,Wasm 插件存在如下优势:
可扩展性:APISIX 通过支持 Wasm,我们可以结合 proxy-wasm 提供的 SDK,使用 C++/Golang/Rust 等语言进行插件开发。由于高级语言往往拥有更加丰富的生态,所以我们可以依托于这些生态来实现支持更多功能丰富的插件。
安全性:由于 APISIX 和 Wasm 之前的调用依托于 proxy-wasm 提供的 ABI(二进制应用接口),这部分的访问调用更为安全。Wasm 插件只允许对请求进行特定的修改。另外,由于 Wasm 插件运行在特定的 VM 中,所以即使插件运行出现崩溃也不会影响 APISIX 主进程的运行。
APISIX 如何支持 WASM
了解完 Wasm,现在我们将从自顶向下的角度来看 APISIX 是如何支持 Wasm 插件功能的。
APISIX Wasm 插件
在 APISIX 中,我们可以使用高级语言 C/C++/Go/Rust 来按照 proxy-wasm 规范以及对应的 SDK 来编写插件。
proxy-wasm 是 Envoy 推出的在 L4/L7 代理之间的 ABI 的规范与标准。在该规范中定义了包含内存管理、四层代理、七层代理扩展等 ABI。例如在七层代理中,proxy-wasm 规范定义了proxy_on_http_request_headers,proxy_on_http_request_body,proxy_on_http_request_trailers,proxy_on_http_response_headers 等 ABI,使得模块能够在各个阶段对请求内容进行获取与修改。
例如,我们使用 Golang 结合 proxy-wasm-go-sdk, 编写如下插件:
proxy-wasm-go-sdk 正是上述 proxy-wasm 规范的 SDK,它帮助开发者更好的使用 Golang 编写 proxy-wasm 插件。不过需要注意的是,由于原生 Golang 在支持 WASI 时存在一些问题,因此该 SDK 基于 TinyGo 实现,更多内容可以点击进行查看。
该插件的主要功能用于将 HTTP 修改请求的响应状态码与响应体,引用自 APISIX 链接,
...func (ctx *pluginContext) OnPluginStart(pluginConfigurationSize int) types.OnPluginStartStatus { data, err := proxywasm.GetPluginConfiguration() if err != nil { proxywasm.LogErrorf("error reading plugin configuration: %v", err) return types.OnPluginStartStatusFailed } var p fastjson.Parser v, err := p.ParseBytes(data) if err != nil { proxywasm.LogErrorf("error decoding plugin configuration: %v", err) return types.OnPluginStartStatusFailed } ctx.Body = v.GetStringBytes("body") ctx.HttpStatus = uint32(v.GetUint("http_status")) if v.Exists("percentage") { ctx.Percentage = v.GetInt("percentage") } else { ctx.Percentage = 100 } // schema check if ctx.HttpStatus < 200 { proxywasm.LogError("bad http_status") return types.OnPluginStartStatusFailed } if ctx.Percentage < 0 || ctx.Percentage > 100 { proxywasm.LogError("bad percentage") return types.OnPluginStartStatusFailed } return types.OnPluginStartStatusOK}func (ctx *httpLifecycle) OnHttpRequestHeaders(numHeaders int, endOfStream bool) types.Action { plugin := ctx.parent if !sampleHit(plugin.Percentage) { return types.ActionContinue } err := proxywasm.SendHttpResponse(plugin.HttpStatus, nil, plugin.Body, -1) if err != nil { proxywasm.LogErrorf("failed to send local response: %v", err) return types.ActionContinue } return types.ActionPause}...
之后,我们通过 tiny-go 将上述的 Golang 代码编译生成 .wasm
文件
tinygo build -o wasm_fault_injection.go.wasm -scheduler=none -target=wasi ./main.go
完成编译之后,我们得到了 fault_injection.go.wasm
文件
如果对 wasm 文件内容感兴趣的话,我们可以使用 wasm-tool 工具来查看该 wasm 文件的具体内容。
wasm-tools dump hello.go.wasm
将 wasm_fault_injection.go.wasm
配置到 APISIX 到 config.yaml
,并将该插件命名为 wasm_fault_injection。
apisix: ...wasm: plugins: - name: wasm_fault_injection priority: 7997 file: wasm_fault_injection.go.wasm
之后,我们启动 APISIX ,并创建一条路由引用该 Wasm 插件:
curl http://127.0.0.1:9180/apisix/admin/routes/1 \-H "X-API-KEY: edd1c9f034335f136f87ad84b625c8f1" -X PUT -d "{ "uri":"/*", "upstream":{ "type":"roundrobin", "timeout":{ "connect":1, "read":1, "send":1 }, "nodes":{ "httpbin.org:80":1 } }, "plugins":{ "wasm_fault_injection":{ "conf":"{\"http_status\":200, \"body\":\"Hello WebAssembly!\n\"}" } }, "name":"wasm_fault_injection"}"
进行访问测试,发现响应体已被修改为 "Hello WebAssembly",由此 Wasm 插件已经生效。
curl 127.0.0.1:9080/get -v* Trying 127.0.0.1:9080...* Connected to 127.0.0.1 (127.0.0.1) port 9080 (#0)> GET /get HTTP/1.1> Host: 127.0.0.1:9080> User-Agent: curl/7.81.0> Accept: */*>* Mark bundle as not supporting multiuse< HTTP/1.1 200 OK< Date: Thu, 09 Feb 2023 07:46:50 GMT< Content-Type: text/plain; charset=utf-8< Transfer-Encoding: chunked< Connection: keep-alive< Server: APISIX/3.1.0
Wasm-nginx-module
了解完 Apache APISIX 如何使用 Wasm 插件,现在我们更进一步来了解 "为什么我们能在 Wasm 插件中获取到请求的内容并修改请求?" 。由于 APISIX 选用 Openresty 作为底层框架,因此 Wasm 插件中想要能够获取到请求内容和修改请求内容,就需要和 openResty 或者 NGINX 提供的 API 进行交互。wasm-nginx-module
正是提供了这部分能力。
wasm-nginx-module 是由 API7 研发的支持 Wasm 的 NGINX 模块。该模块尝试在 NGINX 的基础上实现 proxy-wasm-abi,并且向上封装了 Lua API,使得我们能够在 Lua 层面完成 proxy-wasm-abi 的调用。更多内容可参考 wasm-nginx-module。
例如,当我们的 APISIX 运行到 "access" 阶段时,会调用 wasm-nginx-module
中提供的 Lua 方法on_http_request_headers。
-- apisix/wasm.lua...local ok, err = wasm.on_http_request_headers(plugin_ctx) if not ok then core.log.error(name, ": failed to run wasm plugin: ", err) return 503 endend...
之后在该方法中,将调用 wasm-nginx-module
中 ngx_http_wasm_on_http
方法,
ngx_int_tngx_http_wasm_on_http(ngx_http_wasm_plugin_ctx_t *hwp_ctx, ngx_http_request_t *r, ngx_http_wasm_phase_t type, const u_char *body, size_t size, int end_of_body){ ... ctx = ngx_http_wasm_get_module_ctx(r); if (type == HTTP_REQUEST_HEADERS) { cb_name = &proxy_on_request_headers; } else if (type == HTTP_REQUEST_BODY) { cb_name = &proxy_on_request_body; } else if (type == HTTP_RESPONSE_HEADERS) { cb_name = &proxy_on_response_headers; } else { cb_name = &proxy_on_response_body; } if (type == HTTP_REQUEST_HEADERS || type == HTTP_RESPONSE_HEADERS) { if (hwp_ctx->hw_plugin->abi_version == PROXY_WASM_ABI_VER_010) { rc = ngx_wasm_vm->call(hwp_ctx->hw_plugin->plugin, cb_name, true, NGX_WASM_PARAM_I32_I32, http_ctx->id, 0); } else { rc = ngx_wasm_vm->call(hwp_ctx->hw_plugin->plugin, cb_name, true, NGX_WASM_PARAM_I32_I32_I32, http_ctx->id, 0, 1); } } else { rc = ngx_wasm_vm->call(hwp_ctx->hw_plugin->plugin, cb_name, true, NGX_WASM_PARAM_I32_I32_I32, http_ctx->id, size, end_of_body); } ...}
在 wasm-nginx-module
中,我们将根据不同的阶段,设置 cb_name
,例如:HTTP_REQUEST_HEADERS
对应 proxy_on_request_headers
,之后将在 ngx_wasm_vm->call
中调用 vm 中的方法也就是我们在上文中提到的 wasm 插件 OnHttpRequestHeaders
的方法。
至此,整个 APISIX 调用 wasm 插件,运行 Golang 的调用链便梳理完成,调用链如下:
Wasm VM
Wasm VM 用于真正执行 Wasm 代码的虚拟机,在 wasm-nginx-module
中实现了对两种虚拟机 "wasmtime" 和 "wasmedge" 两种虚拟机,在 APISIX 中默认选择使用 "wasmtime" 作为 Wasm 代码的运行虚拟机。
WasmtimeWasmtime 是由 bytecodealliance 开源的 WebAssembly 和 WASI 的小型高效运行时。它能够在 Web 外部运行 WebAssembly 代码,即可以用作命令行使用,也可以作为 WebAssembly 运行引擎嵌入到其他程序作为库使用。WasmedgeWasmedge 是为边缘计算优化的轻量级、高性能、可扩展的 WebAssembly (Wasm) 虚拟机,可用于云原生、边缘和去中心化的应用。
在 Wasm vm 中首先通过 load
方法将 .wasm
文件加载到内存,之后我们便可以通过 VM 的 call 方法来调用这些方法。VM 底层依托于 WASI 的接口实现,使得 Wasm 代码不仅能够运行在浏览器端,同时也支持能够在服务端进行。
总结
通过本文我们了解到 Wasm 是什么以及 APISIX 如何支持 Wasm 插件。APISIX 通过支持 Wasm 插件,不但可以扩充对多语言的支持,例如通过 C++, Rust, Golang, AssemblyScript 等进行插件开发,而且由于 WebAssembly 正在从浏览器走向云原生拥有了更加丰富的生态与使用场景,因此 APISIX 也可以借助 Wasm 完成在 API 网关侧更多的扩展功能,解决更多使用场景。
关于 API7.ai 与 APISIX
API7.ai(支流科技 )是一家提供 API 处理和分析的开源基础软件公司,于 2019 年开源了新一代云原生 API 网关 -- APISIX 并捐赠给 Apache 软件基金会。此后,API7.ai 一直积极投入支持 Apache APISIX 的开发、维护和社区运营。与千万贡献者、使用者、支持者一起做出世界级的开源项目,是 API7.ai 努力的目标。
关键词:
-
环球今头条!WebAssembly 助力云原生:APISIX 如何借助 Wasm 插件实现扩展功能?
本文将介绍Wasm,以及ApacheAPISIX如何实现Wasm功能。作者朱欣欣,API7 ai技术工程师原文链接什么是Was...
来源: 环球今头条!WebAssembly 助力云原生:APISIX 如何借助 Wasm 插件实现扩展功能?
世界速看:记录-html-docs-js避坑指南
阿里正式加入ChatGPT战局,“通义千问”上线后表现如何?
全球消息!债市日报:4月10日
焦点关注:重磅!亚洲最大推力液体火箭发动机试车台调试完成
视焦点讯!堆料最足超大杯!小米13 Ultra确认可变光圈+全焦段四摄
全优大七座SUV!全新一代揽月正式上市 18.99万元起售
环球最新:2人观影全程用手机录制电影内容 目击者:中途还换了一个手机
米哈游《崩坏星穹铁道》姬子角色PV:成熟妩媚的大姐姐
今日快讯:“算力中国行”大型调研采访活动启动,将深入各地了解算力应用发展情况
天天日报丨刷题疑惑3
今日观点!TCP三次握手和四次挥手
【环球报资讯】收评:人工智能板块跳水 10只注册制主板新股大涨
播报:ChatGPT消除无聊的工作 诺奖得主:人类上四休三就靠AI
对标特斯拉Model Y 小鹏G6再放送 博主:兴奋起来吧、有电动尾翼
《名侦探柯南:黑铁的鱼影》新宣传图 成人版灰原哀太劲爆
精彩看点:第三次!沈腾主演《满江红》宣布密钥再次延期:上映至5月15日
亚马逊安抚员工:公司并没有在AI竞争中落下
天天微资讯!私募巨头阿波罗:美国信贷紧缩已开始
全球信息:【AIGC】ChatGPT 相关分享
互联网+医疗|如何满足各项安全合规要求
全球新资讯:一代“金牌配角” 中国香港知名演员吴耀汉去世:终年83岁
世界热消息:单核性能猛增68% 龙芯确认下代CPU性能达市场主流水平
【全球速看料】已做到笔记本电脑大小 国产量子计算机再进化:三大产品升级
环球信息:撞脸苹果!金立发布F1 Plus手机:刘海屏设计 国产8核CPU
《生化危机4:重制版》艾达王配音首次发声:亚裔女演员不止是花瓶
今日热文:广东2023年注会考试报名系统
世界即时:低至200元 / 月,火山引擎DataLeap帮你搭建企业级数据中台
天天短讯!奔驰EQG将采用革命性电池技术:续航、充电性能大增
全球看热讯:又是单踏板让车失控?重庆一特斯拉突然加速撞7车:官方确认车没问题驾驶员全责
mp3是什么格式的文件?怎么下载歌曲到MP3上?
怎么增大电脑虚拟内存页面文件大小?电脑虚拟内存页面怎么设置?
荣耀7i上市时间及价格是什么?荣耀7i配置和参数
英雄联盟s24赛季什么时候开始的?英雄联盟s24赛季结束时间
东部战区重磅发布:砺剑亮剑,驱虎打狐
天天短讯!Github使用教程
新资讯:在.NET7中使用MQTTnet简单实现MQTT通信
dnf成就格林赛罗斯战场怎么进?dnf成就格林赛罗斯战场任务怎么做?
焦点速读:击败《冰雪奇缘2》创新世界纪录!《超级马力欧兄弟》5天狂揽26亿票房
每日热文:自动驾驶是忽悠?蔚来李斌:目标是解放时间 减少事故
当前快讯:269元 米家快煮电饭煲4L预售:25分钟即熟
手工扯面+秘制辣油 西安饭庄油泼biangbiang面大促:6.66元/盒
用 Go 剑指 Offer 40. 最小的k个数 (Top K 问题)
快看点丨Web渗透测试流程
重点聚焦!SonarQube(CE)版集群环境下的高可用性实践
当前短讯!Java-泛型机制详解
最新快讯!Go常用库之GoRequests
十五五规划时期,未来十大新兴产业有哪些
世界视点!中兴Axon Pad来了:全球唯一5G双系统平板
医生误判将女孩恒牙当乳牙拔掉 科普:恒牙和乳牙区别
当前关注:日系车在中国真不香了!丰田、本田、日产、马自达全线暴跌
快资讯:iOS 16.4体验大翻车!苹果关闭降级通道:只许升新版
天天即时看!80/90后回忆杀!经典日漫《铁甲小宝》高清修复了:画质提升明显
【环球新要闻】全文索引:Apache Lucene(二)
Selenium做Web自动化踩过的坑
每日聚焦:通俗解释 JVM CAS 机制
世界观点:4月10日11时浙江嘉兴疫情最新消息 4月10日11时浙江嘉兴今日确诊人数
每日快播:米家空调巨省电首销:2匹大风量 2799元
环球热点!小米MIJIA智能音频眼镜发布!独特耳机眼镜二合一设计
世界热推荐:新手爸爸拿狗狗练拍嗝 网友:狗狗从来没享受过这么高的待遇
环球观察:周杰伦就不正当竞争起诉网易!4月17日开庭
日本非现金支付比例仅占36% 远落后于中国农村
重磅来了!
介绍一下sourcemap
今日关注:全网最详细中英文ChatGPT-GPT-4示例文档-文章大纲智能生成器从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js
一季报预览:哪些公司业绩有望超预期
全球快看点丨迪拜拍出世界最贵车牌号:价值超1亿元!
各地开通旅游专列:去淄博吃烧烤都有专列了
环球今亮点!米粉催卢伟冰发小米13 Ultra:我想冲顶配版
丰田在日召回超20万辆汽车:发动机有火灾隐患 已烧了两辆
世界观焦点:整合Microsoft 365服务:Win11文件管理器将迎来大更新
如何部署VSCODE SERVER
Silverlight教程_编程入门自学教程_菜鸟教程-免费教程分享
环球今日讯!围挡后面丨长沙河西首个三甲妇幼医院住院楼封顶!预计2025年建成投用
【天天新要闻】还去吗?泰国清迈发布“居家办公令” PM2.5超标准5倍:游客因空气污染锐减
“数学之王”丘成桐AI人工智能投入不能急功近利:中国很多技术卡脖子 基础科学没做好
元宇宙崩盘 林俊杰疑回应炒虚拟地产亏91%:听说很多人想帮我理财
北方大范围沙尘又来了 今年的沙尘天气为啥显得格外多?
天天观速讯丨通过 lua 进行 nginx redis 访问控制
焦点热议:多项数据向好 交通物流加速“跑起来”
环球要闻:背景太假哥疆域阿力木捡的狗“狼里狼气” 网友出谋划策辨认
【环球新视野】极氪X官宣4月12日上市:全能SUV 零百加速3秒级
焦点热文:我国构建世界首个番茄超泛基因组:能让番茄更好吃、产量多6成
全球播报:男女配合当街开井盖用勺挖地沟油被网友拍下引围观:行为太恶劣 应严惩
天天微资讯!林俊杰“炒房”浮亏91%?元宇宙泡沫的冰山一角
【时快讯】学系统集成项目管理工程师(中项)系列05_配置管理
天天动态:一不注意就被坑,家电“潜规则”早知道早好
今日热文:Spring5课堂笔记
Java8 Stream流式编程
【新要闻】128核心Arm处理器能跑Windows!还能配NVIDIA显卡
时讯:新疆和硕:田间地头 话两会
maptalks点线面图形样式设置经验总结
【天天速看料】马龙惊魂3-2拒绝一轮游,与小林再迎老少对决!国乒首日狂走钢丝
在米其林餐厅找罪受?人均8千元餐厅疑发生食物中毒
世界热点!张艺谋宣布将拍网剧《英雄联盟》!第一次 想拍个不一样的
环球新动态:Vulnhub Mercy靶场 Walkthrough
FSR、DLSS谁更好?26款游戏PK:AMD居然0胜!
环球速看:AI 史话
每日讯息!Weex原理及架构剖析
旅游专列来啦具体详细内容是什么