You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@apisix.apache.org by GitBox <gi...@apache.org> on 2021/11/19 05:53:35 UTC

[GitHub] [apisix-website] yzeng25 commented on a change in pull request #754: docs: add APISIX support WASM blog

yzeng25 commented on a change in pull request #754:
URL: https://github.com/apache/apisix-website/pull/754#discussion_r752879199



##########
File path: website/i18n/zh/docusaurus-plugin-content-blog/2021/11/19/apisix-support-wasm.md
##########
@@ -0,0 +1,182 @@
+---
+title: "重磅功能!Apache APISIX 拥抱 WASM 生态"
+author: "罗泽轩"
+authorURL: "https://github.com/spacewander"
+authorImageURL: "https://avatars.githubusercontent.com/u/4161644?v=4"
+keywords: 
+- Apache APISIX
+- WASM
+- WebAssembly
+- 生态
+- 插件
+description: 在即将发布的 Apache APISIX 版本(2.11.0)中将会新增对于 WASM 的支持!通过阅读本文你将了解到 Apache APISIX 如何从0到1部署这项功能的支持与开发。
+tags: [Technology]
+---
+
+> 在即将发布的 Apache APISIX 版本(2.11.0)中将会新增对于 WASM 的支持!通过阅读本文你将了解到 Apache APISIX 如何从0到1部署这项功能的支持与开发。
+
+<!--truncate-->
+
+在即将发布的 Apache APISIX 版本(2.11.0)中,我们新增了对于 WASM 的支持!现在开发者除了可以使用 Lua、Java、Go、Python、JavaScript 等多种编程语言开发 APISIX 的插件之外,也可以用 WASM 来开发插件。
+
+![拥抱 WASM 生态](https://static.apiseven.com/202108/1637289637179-ab74d38f-acd4-4401-908f-e1d310a33583.png)
+
+WASM 全称 [WebAssembly](https://webassembly.org/),与上述具体编程语言运行时的不同之处在于,它是一套字节码标准,专门设计成可以在宿主环境中嵌套使用。
+
+如果某种编程语言提供编译成 WASM 字节码的功能,就可以把该语言的应用编译成 WASM 字节码,运行在某个支持 WASM 的宿主环境中。
+
+听起来,是不是只要某个宿主环境支持 WASM,就能像操作系统一样运行任意应用呢?
+
+但其实这里有个限制,就像操作系统需要实现特定标准的 syscall 一样,要想运行特定的应用,也需要实现该应用所需的 API。
+
+以 JavaScript 为例,虽然同样是 JavaScript 代码,但是针对浏览器写的 JS 模块不能直接用在 npm 包里面,因为两个的 API 不一样。
+
+所以仅仅把 WASM 放到 Apache APISIX 里面并行不通,要想让开发者在 Apache APISIX 上运行 WASM,我们还需要提供一套专门的 API。
+
+## 为什么选择 Proxy WASM
+
+对于如何提供这套 API,我们曾经权衡过两套方案:
+
+1. 参考 lua-nginx-module 的接口,实现对应的 WASM 版 API
+2. 实现 Proxy WASM 这一套标准
+
+[Proxy WASM](https://github.com/proxy-wasm/spec) 是 Envoy 的 WASM API 标准。所以上述问题其实等价于,我们是自己搞一套 API 标准还是复用 Envoy 已有标准呢?
+
+> WASM API 标准可以拆成两个方面来看:
+    1. Host,负责提供 API 的实现
+    2. SDK,要想在不同的编程语言里面调用提供的 API,需要使用该语言来实现一套胶水层
+
+如果我们遵循 Envoy 的标准,优势在于可以复用 Envoy 现有的 WASM SDK(Proxy WASM SDK),而不足之处在于这套标准是 Envoy 结合自己情况制定的,如果我们跟着实现,没有自己量身定制那么轻松。
+
+经过社区的讨论后,我们最终决定采用 Proxy WASM 标准。「做难且正确的事」,实现 Proxy WASM 自然是难的事,但我们相信这是正确的事,通过社区的合作和共建,可以构建更加繁荣的生态。
+
+## 如何在 Apache APISIX 中使用 WASM
+
+Apache APISIX 目前已初步支持 WASM,可以使用 WASM 来编写 fault-injection 插件的部分功能。感兴趣的读者可以在本月底的 Apache APISIX 2.11.0 版本中尝尝鲜,敬请期待!
+
+下面我们将结合 [proxy-wasm-go-sdk](https://github.com/tetratelabs/proxy-wasm-go-sdk/) 来讲讲怎么用 WASM 实现注入自定义响应的功能。
+
+### 步骤一:基于 proxy-wasm-go-sdk 编写代码
+
+实现代码(包含 `go.mod` 和其他)具体细节可[点击此处](https://github.com/apache/apisix/tree/master/t/wasm)查阅。
+
+这里需要解释下,虽然 proxy-wasm-go-sdk 这个项目带了 Go 的名字,但它其实用的是 tinygo 而不是原生的 Go。因为原生的 Go 在支持 WASI (你可以认为它是非浏览器的 WASM 运行时接口)时会有一些问题,详情可[点击此处](https://github.com/tetratelabs/proxy-wasm-go-sdk/blob/main/doc/OVERVIEW.md#tinygo-vs-the-official-go-compiler)查阅。
+
+### 步骤二:构建对应的 WASM 文件
+
+```shell
+tinygo build -o ./fault-injection/main.go.wasm -scheduler=none -target=wasi ./fault-injection/main.go
+```
+
+### 步骤三:在 Apache APISIX 的 `config.yaml` 引用该文件
+
+```yaml
+apisix:
+        ...
+wasm:
+    plugins:
+        - name: wasm_fault_injection
+          priority: 7997
+          file: t/wasm/fault-injection/main.go.wasm
+```
+
+通过以上操作,你可以像用 Lua 插件一样用这个 WASM 插件,比如:
+
+```yaml
+uri: "/wasm"
+plugins:
+  wasm_fault_injection:
+    conf: '{"body":"hello world", "http_status":200}'
+upstream:
+  type: roundrobin
+  nodes:
+    127.0.0.1:1980: 1
+```
+
+注意 WASM 插件的配置都是 conf 字段下面的一条字符串,由对应的插件自己去做解析。
+
+## 横向测评——条条大道通罗马
+
+Apache APISIX 发展到现在,已经有三种编写插件的方式:
+
+1. 原生的 Lua way,跑在 APISIX 里面
+2. 多种语言的外部插件 runner,插件逻辑跑在 APISIX 外面
+3. 把多种语言编译成 WASM,依然跑在 APISIX 里面
+
+![APISIX 生态支持](https://static.apiseven.com/202108/1637289637159-f2fd1f09-4be6-4cd4-88a0-9c3a23c4f405.png)
+
+这三种方式在诸如生态、成熟度等各个方面都差异很大。正巧我们都可以用它们来实现 fault-injection,所以可以比比看。
+
+### 步骤一:配置路由
+
+Lua way 的 fault-injection,自然是使用内置的 fault-injection 插件。Runner way 的 fault-injection 实现具体可[点击此处](https://github.com/apache/apisix-go-plugin-runner/blob/master/cmd/go-runner/plugins/fault_injection.go)查阅。
+
+接下来让我们分别给它们配置不同的路由:
+
+```yaml
+---
+uri: "/wasm"
+plugins:
+  wasm_fault_injection:
+    conf: '{"body":"hello world", "http_status":200}'
+upstream:
+  type: roundrobin
+  nodes:
+    127.0.0.1:1980: 1
+---
+plugins:
+  ext-plugin-pre-req:
+    conf:
+    - name: fault-injection
+      value: '{"body":"hello world", "http_status":200}'
+upstream:
+  nodes:
+    127.0.0.1:1980: 1
+  type: roundrobin
+uri: /ext-plugin
+---
+plugins:
+  fault-injection:
+    abort:
+      body: hello world
+      http_status: 200
+upstream:
+  nodes:
+    127.0.0.1:1980: 1
+  type: roundrobin
+uri: /fault-injection
+```
+
+### 步骤二:实际压测
+
+接下来试着用 wrk 压一下,具体数据对比如下:

Review comment:
       ```suggestion
   接下来试着用 wrk 进行压测,具体数据对比如下:
   ```

##########
File path: website/i18n/zh/docusaurus-plugin-content-blog/2021/11/19/apisix-support-wasm.md
##########
@@ -0,0 +1,182 @@
+---
+title: "重磅功能!Apache APISIX 拥抱 WASM 生态"
+author: "罗泽轩"
+authorURL: "https://github.com/spacewander"
+authorImageURL: "https://avatars.githubusercontent.com/u/4161644?v=4"
+keywords: 
+- Apache APISIX
+- WASM
+- WebAssembly
+- 生态
+- 插件
+description: 在即将发布的 Apache APISIX 版本(2.11.0)中将会新增对于 WASM 的支持!通过阅读本文你将了解到 Apache APISIX 如何从0到1部署这项功能的支持与开发。

Review comment:
       ```suggestion
   description: 在即将发布的 Apache APISIX 版本(2.11.0)中将会新增对于 WASM 的支持!通过阅读本文你将了解到 Apache APISIX 如何从 0 到 1 部署这项功能的支持与开发。
   ```

##########
File path: website/i18n/zh/docusaurus-plugin-content-blog/2021/11/19/apisix-support-wasm.md
##########
@@ -0,0 +1,182 @@
+---
+title: "重磅功能!Apache APISIX 拥抱 WASM 生态"
+author: "罗泽轩"
+authorURL: "https://github.com/spacewander"
+authorImageURL: "https://avatars.githubusercontent.com/u/4161644?v=4"
+keywords: 
+- Apache APISIX
+- WASM
+- WebAssembly
+- 生态
+- 插件
+description: 在即将发布的 Apache APISIX 版本(2.11.0)中将会新增对于 WASM 的支持!通过阅读本文你将了解到 Apache APISIX 如何从0到1部署这项功能的支持与开发。
+tags: [Technology]
+---
+
+> 在即将发布的 Apache APISIX 版本(2.11.0)中将会新增对于 WASM 的支持!通过阅读本文你将了解到 Apache APISIX 如何从0到1部署这项功能的支持与开发。
+
+<!--truncate-->
+
+在即将发布的 Apache APISIX 版本(2.11.0)中,我们新增了对于 WASM 的支持!现在开发者除了可以使用 Lua、Java、Go、Python、JavaScript 等多种编程语言开发 APISIX 的插件之外,也可以用 WASM 来开发插件。
+
+![拥抱 WASM 生态](https://static.apiseven.com/202108/1637289637179-ab74d38f-acd4-4401-908f-e1d310a33583.png)
+
+WASM 全称 [WebAssembly](https://webassembly.org/),与上述具体编程语言运行时的不同之处在于,它是一套字节码标准,专门设计成可以在宿主环境中嵌套使用。
+
+如果某种编程语言提供编译成 WASM 字节码的功能,就可以把该语言的应用编译成 WASM 字节码,运行在某个支持 WASM 的宿主环境中。
+
+听起来,是不是只要某个宿主环境支持 WASM,就能像操作系统一样运行任意应用呢?
+
+但其实这里有个限制,就像操作系统需要实现特定标准的 syscall 一样,要想运行特定的应用,也需要实现该应用所需的 API。
+
+以 JavaScript 为例,虽然同样是 JavaScript 代码,但是针对浏览器写的 JS 模块不能直接用在 npm 包里面,因为两个的 API 不一样。
+
+所以仅仅把 WASM 放到 Apache APISIX 里面并行不通,要想让开发者在 Apache APISIX 上运行 WASM,我们还需要提供一套专门的 API。
+
+## 为什么选择 Proxy WASM
+
+对于如何提供这套 API,我们曾经权衡过两套方案:
+
+1. 参考 lua-nginx-module 的接口,实现对应的 WASM 版 API
+2. 实现 Proxy WASM 这一套标准
+
+[Proxy WASM](https://github.com/proxy-wasm/spec) 是 Envoy 的 WASM API 标准。所以上述问题其实等价于,我们是自己搞一套 API 标准还是复用 Envoy 已有标准呢?
+
+> WASM API 标准可以拆成两个方面来看:
+    1. Host,负责提供 API 的实现
+    2. SDK,要想在不同的编程语言里面调用提供的 API,需要使用该语言来实现一套胶水层
+
+如果我们遵循 Envoy 的标准,优势在于可以复用 Envoy 现有的 WASM SDK(Proxy WASM SDK),而不足之处在于这套标准是 Envoy 结合自己情况制定的,如果我们跟着实现,没有自己量身定制那么轻松。
+
+经过社区的讨论后,我们最终决定采用 Proxy WASM 标准。「做难且正确的事」,实现 Proxy WASM 自然是难的事,但我们相信这是正确的事,通过社区的合作和共建,可以构建更加繁荣的生态。
+
+## 如何在 Apache APISIX 中使用 WASM
+
+Apache APISIX 目前已初步支持 WASM,可以使用 WASM 来编写 fault-injection 插件的部分功能。感兴趣的读者可以在本月底的 Apache APISIX 2.11.0 版本中尝尝鲜,敬请期待!
+
+下面我们将结合 [proxy-wasm-go-sdk](https://github.com/tetratelabs/proxy-wasm-go-sdk/) 来讲讲怎么用 WASM 实现注入自定义响应的功能。
+
+### 步骤一:基于 proxy-wasm-go-sdk 编写代码
+
+实现代码(包含 `go.mod` 和其他)具体细节可[点击此处](https://github.com/apache/apisix/tree/master/t/wasm)查阅。
+
+这里需要解释下,虽然 proxy-wasm-go-sdk 这个项目带了 Go 的名字,但它其实用的是 tinygo 而不是原生的 Go。因为原生的 Go 在支持 WASI (你可以认为它是非浏览器的 WASM 运行时接口)时会有一些问题,详情可[点击此处](https://github.com/tetratelabs/proxy-wasm-go-sdk/blob/main/doc/OVERVIEW.md#tinygo-vs-the-official-go-compiler)查阅。
+
+### 步骤二:构建对应的 WASM 文件
+
+```shell
+tinygo build -o ./fault-injection/main.go.wasm -scheduler=none -target=wasi ./fault-injection/main.go
+```
+
+### 步骤三:在 Apache APISIX 的 `config.yaml` 引用该文件

Review comment:
       
   ```suggestion
   ### 步骤三:在 Apache APISIX 的 config.yaml 引用该文件
   ```

##########
File path: website/i18n/zh/docusaurus-plugin-content-blog/2021/11/19/apisix-support-wasm.md
##########
@@ -0,0 +1,182 @@
+---
+title: "重磅功能!Apache APISIX 拥抱 WASM 生态"
+author: "罗泽轩"
+authorURL: "https://github.com/spacewander"
+authorImageURL: "https://avatars.githubusercontent.com/u/4161644?v=4"
+keywords: 
+- Apache APISIX
+- WASM
+- WebAssembly
+- 生态
+- 插件
+description: 在即将发布的 Apache APISIX 版本(2.11.0)中将会新增对于 WASM 的支持!通过阅读本文你将了解到 Apache APISIX 如何从0到1部署这项功能的支持与开发。
+tags: [Technology]
+---
+
+> 在即将发布的 Apache APISIX 版本(2.11.0)中将会新增对于 WASM 的支持!通过阅读本文你将了解到 Apache APISIX 如何从0到1部署这项功能的支持与开发。

Review comment:
       ```suggestion
   > 在即将发布的 Apache APISIX 版本(2.11.0)中将会新增对于 WASM 的支持!通过阅读本文你将了解到 Apache APISIX 如何从 0 到 1 部署这项功能的支持与开发。
   ```




-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscribe@apisix.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org