生态丰富持续进行中,Apache OpenWhisk 集成闪亮登场

白泽平

更新时间 12/24/2021

本文将介绍 Apache APISIX 中新增插件——openwhisk,并通过详细步骤向大家展示如何将 OpenWhisk 服务与 Apache APISIX 进行集成,来享受无服务器计算的优势。此插件预计在 Apache APISIX 2.12 版本中正式上线,敬请期待!

APISIX&OpenWhisk

项目介绍

Apache APISIX

Apache APISIX 是一个动态、实时、高性能的 API 网关,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。Apache APISIX 不仅支持插件动态变更和热插拔,而且拥有众多实用的插件。

Apache OpenWhisk

Apache OpenWhisk 是一个开源的分布式无服务器平台,可以通过执行函数响应任何规模的时间。它使用 Docker 容器管理基础设施、服务器和规模扩展,助力用户构建出色且高效的应用程序。

在 OpenWhisk 中开发者可以使用多种编程语言来编写函数(称为 Action),这些函数将由 OpenWhisk 负责动态调度并处理来自事件(通过 trigger)或外部请求(通过 HTTP 请求)的响应。

集成原理

Apache APISIX 为便捷集成 Apache OpenWhisk 提供了插件支持,用户可以定义一个包含无服务器插件的路由,并结合 Apache APISIX 提供的多种身份认证插件来实现认证与授权功能。

大体操作原理如下:用户可以使用openwhisk插件在路由中定义一个“动态上游”,当路由匹配到请求时,它将中止到原上游的请求,并向 OpenWhisk 的 API Host 端点发送请求。

请求中将包含用户为插件配置的 Namespace、Action、Service Token 以及原始 HTTP 请求体数据,并将从 OpenWhisk 中获取到的响应内容返回至客户端。

如何使用

步骤一:搭建 Apache OpenWhisk 测试环境

  1. 首先,您需要确保使用 Linux 系统,并且系统中已经安装了 Docker 软件。执行以下命令:
1docker run --rm -d \
2  -h openwhisk --name openwhisk \
3  -p 3233:3233 -p 3232:3232 \
4  -v /var/run/docker.sock:/var/run/docker.sock \
5  openwhisk/standalone:nightly
6
7docker exec openwhisk waitready
  1. 等待命令执行完成后,将输出以下内容:
1ok: whisk auth set. Run 'wsk property get --auth' to see the new value.
2ok: whisk API host set to http://openwhisk:3233
3ok: updated action testme
4server initializing...
5server initializing...
6    "ready": true
7ok: deleted action testme
  1. 创建以下文件 test.js 用作测试函数。
1function main(args) {
2    return {
3        "hello": args.name || "",
4    };
5}
  1. 在 OpenWhisk 中注册以上函数。
1# 为 OpenWhisk CLI 工具设置 API Host 和鉴权信息,您可以从这里 https://s.apache.org/openwhisk-cli-download 下载它
2wsk property set \
3  --apihost 'http://localhost:3233' \
4  --auth '23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP'
5
6# 创建测试函数
7wsk action create test test.js

步骤二:创建路由并开启 openwhisk 插件

下面我们将创建一个路由,并为其添加 openwhisk 插件。执行以下命令:

1curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
2{
3    "plugins": {
4        "openwhisk": {
5            "api_host": "http://localhost:3233",
6            "service_token": "23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP",
7            "namespace": "guest",
8            "action": "test"
9        }
10    },
11    "uri": "/openwhisk"
12}'

步骤三:测试请求

下面我们将使用 cURL 进行测试。

1# 使用 POST 请求并发送数据
2curl http://127.0.0.1:9080/openwhisk -i -X POST -d '{
3    "name": "world"
4}'
5
6HTTP/1.1 200 OK
7Content-Type: application/json
8Content-Length: 17
9Server: APISIX/2.10.2
10
11{"hello":"world"}
12
13# 使用 GET 请求
14curl http://127.0.0.1:9080/openwhisk -i
15
16HTTP/1.1 200 OK
17Content-Type: application/json
18Content-Length: 12
19Server: APISIX/2.10.2
20
21{"hello":""}

步骤四:测试复杂响应

  1. 创建并更新 test.js 测试函数
1function main(args) {
2    return {
3        "status": "403",
4        "headers": {
5            "test": "header"
6        },
7        "body": "A test body"
8    };
9}
10
112. 进行测试请求
12
13```shell
14# 使用 GET 请求
15curl http://127.0.0.1:9080/openwhisk -i
16
17HTTP/1.1 403 FORBIDDEN
18Content-Type: application/json
19Content-Length: 12
20test: header
21Server: APISIX/2.10.2
22
23A test body

补充:关闭插件

如使用完毕,只需移除路由配置中 OpenWhisk 相关配置并保存,即可关闭路由上的 OpenWhisk 插件。此时您可以开启其他 Serverless 类插件或添加上游等后续操作。

得益于 Apache APISIX 的动态化优势,开启关闭插件的过程都不需要重启 Apache APISIX,十分方便。

总结

本文为大家介绍了关于 openwhisk 插件的功能前瞻与使用步骤,更多关于 openwhisk 插件说明和完整配置列表,可以参考官方文档

目前,我们也在开发其他 Serverless 插件以便与更多云服务进行集成。如果您对此类集成项目感兴趣,也欢迎随时在 GitHub Discussions 中发起讨论,或通过邮件列表进行交流。