ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Apache APISIX openwhisk 插件实战:将 OpenWhisk 无服务器函数无缝接入 API 网关

Apache APISIX openwhisk 插件实战:将 OpenWhisk 无服务器函数无缝接入 API 网关 Apache APISIX openwhisk 插件实战将 OpenWhisk 无服务器函数无缝接入 API 网关【免费下载链接】apisixThe Cloud-Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/ap/apisix导读openwhisk是 Apache APISIX 中用于对接 Apache OpenWhisk 无服务器平台的官方插件它允许你在 Route 上配置该插件将客户端请求直接转发到 OpenWhisk 的 API 端点执行指定 action从而让 APISIX 网关成为无服务器函数的统一流量入口。读完本文你将掌握 openwhisk 插件全部配置参数的含义与取值范围、如何用 Docker 启动一个独立的 OpenWhisk 并用wskCLI 创建测试函数、如何通过 Admin API 在 Route 上启用/移除该插件以及插件内部请求转发与响应解析的实现原理和对应的测试验证用例。Description插件是什么openwhisk插件用于将 APISIX 与 Apache OpenWhisk 无服务器平台集成。它配置在 Route 上客户端请求会经由 APISIX 被发送到配置好的 OpenWhisk API 端点作为 upstream由 OpenWhisk 执行对应的 action 并返回结果。它属于 APISIX 的 serverless 类集成插件与 aws-lambda、azure-functions、openfunction 等插件同属一个家族在 apisix/cli/config.lua 的默认插件清单中默认启用无需额外配置即可直接使用。从插件元信息见 apisix/plugins/openwhisk.lua可以看到该插件priority -1901较低的优先级在绝大多数请求处理插件之后执行version 0.1插件名name openwhisk。Attributes全部配置参数详解原文档的 Attributes 表格给出了插件支持的参数结合源码 apisix/plugins/openwhisk.lua 中的 schema 定义各参数如下名称类型必填默认值取值范围说明api_hoststring是无-OpenWhisk API 主机地址例如https://localhost:3233ssl_verifyboolean否true-设为true时校验 SSL 证书service_tokenstring是无格式为xxx:xxxOpenWhisk 服务 token调用 API 时通过 Basic Auth 传递namespacestring是无最长 256 字符匹配[\w]或[\w][\w .-]*[\w.-]模式OpenWhisk 命名空间例如guestpackagestring否无最长 256 字符模式同 namespaceOpenWhisk 包名源码中新增支持用于调用包内 actionactionstring是无最长 256 字符模式同 namespaceOpenWhisk action 名称例如helloresultboolean否true-设为true时获取 action 元数据执行函数并返回响应timeoutinteger否3000源码/ 文档示例 60000[1, 60000]单位 msOpenWhisk action 执行与 HTTP 调用超时时间keepaliveboolean否true-设为true时保持连接以供复用keepalive_timeoutinteger否60000[1000, ...]单位 ms连接空闲多久不关闭keepalive_poolinteger否5[1, ...]该连接关闭前最多可发送的请求数需要特别指出文档与源码的细节差异timeout 的默认值文档表格中写的是 60000ms但源码 schema 中的实际默认值是3000见 apisix/plugins/openwhisk.lua。在未显式配置该参数时插件会采用源码默认的 3000ms。超时范围严格限定在 [1, 60000]ms 之间超出会被 schema 校验拒绝。package 参数源码在文档表格之外额外支持package字段用于调用 OpenWhisk 包内的 action但文档 Attributes 表中未列出使用时需注意。参数名校验规则namespace、package、action三个字段都应用了name_pattern\A([\w]|[\w][\w .-]*[\w.-])\z正则校验避免注入不合法的路径片段。敏感字段加密service_token被声明在encrypt_fields {service_token}中意味着通过 Admin API 写入后会在 etcd 中以加密形式存储测试用例 t/plugin/openwhisk.tTEST 5专门验证了这一点——从 etcd 读取到的service_token是密文而非明文这是一项重要的安全设计。:::note 关于 timeout 的说明timeout参数同时决定了两件事OpenWhisk action 的执行时间上限以及 APISIX 侧 HTTP 客户端的超时时间。OpenWhisk action 调用可能需要拉取运行时镜像并启动容器耗时较长因此如果该值设置得太小可能导致大量请求失败。OpenWhisk 平台本身支持的 action 超时范围为 1ms 到 60000ms建议至少设置为 1000ms。:::安全检查TLS 校验警告在check_schemaapisix/plugins/openwhisk.lua中插件调用了core.utils.check_https({api_host}, conf, _M.name)和core.utils.check_tls_bool({ssl_verify}, conf, _M.name)两个安全校验函数check_https会检查api_host是否以https开头若未使用 TLS 会输出日志警告Using openwhisk api_host with no TLS is a security risk实现见 apisix/core/utils.luacheck_tls_bool会检查ssl_verify是否被显式关闭若关闭同样会给出安全风险警告见 apisix/core/utils.lua。对应测试 t/plugin/security-warning2.t 中的 TEST 7 / TEST 8 分别验证了http://与https://两种 api_host 下的告警行为。生产环境务必使用 HTTPS 并保持ssl_verify true。请求转发与响应解析源码级实现原理插件在access阶段完成全部转发逻辑apisix/plugins/openwhisk.lua核心流程如下构造 OpenWhisk REST 调用参数以POST方式调用请求体透传客户端请求体core.request.get_body()并携带三个查询参数blocking true同步阻塞等待 action 执行完成、result tostring(conf.result)、timeout conf.timeout。请求头中通过Authorization: Basic base64(service_token)进行 Basic Auth 认证token 格式xxx:xxx即 OpenWhisk 的 API key 与 secret 组合Content-Type固定为application/json。构建 action 端点端点为{api_host}/api/v1/namespaces/{namespace}/actions/{package/}{action}其中 package 段可选有 package 时拼成package/action。连接池与超时控制若keepalive为 true则设置keepalive_timeout与keepalive_pool同时用httpc:set_timeout(conf.timeout)设置 HTTP 客户端总超时。若请求失败如 OpenWhisk 不可达记录错误日志failed to process openwhisk action, err: ...并返回 503。解析响应OpenWhisk 支持两种 action 返回形式——只返回响应体或返回包含状态码和头的结构化 JSON。插件对响应体做 JSON 解码若解码失败记录错误并返回 503若 JSON 中含headers字段则通过core.response.set_header(result.headers)回写响应头最终状态码取result.statusCode缺省时用上游res.status响应体取result.body缺省时用原始res.body。测试用例 t/plugin/openwhisk.t 中的 TEST 17自定义状态码 407、TEST 19自定义响应头test: header、TEST 21自定义响应体{test:body}分别验证了这三种返回形式的透传行为。Enable Plugin启用插件第一步启动 OpenWhisk在配置插件之前需要先有一个运行中的 OpenWhisk 环境。下面的示例以 standalone 模式启动 OpenWhiskdocker run --rm -d \ -h openwhisk --name openwhisk \ -p 3233:3233 -p 3232:3232 \ -v /var/run/docker.sock:/var/run/docker.sock \ openwhisk/standalone:nightly docker exec openwhisk waitready其中 3233 端口为 OpenWhisk 的 API 端口3232 端口为内部端口挂载宿主机 docker.sock 用于 standalone 模式拉起 action 容器。第二步安装 openwhisk-cli 并创建测试 action安装openwhisk-cli工具后可从其发布的可执行二进制wsk获取配置 API host 与认证信息并创建一个测试用的 actionwsk property set --apihost http://localhost:3233 --auth 23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP wsk action update test (echo function main(){return {ready:true}}) --kind nodejs:14上面命令创建了一个名为test、返回{ready:true}的 Node.js 14 action--auth参数中的xxx:xxx形式即为插件service_token要使用的值。第三步在 Route 上启用插件获取 Admin API 的admin_key来自 conf/config.yaml 的deployment.admin.admin_key然后通过 Admin API 创建路由并挂载插件admin_key$(yq .deployment.admin.admin_key[0].key conf/config.yaml | sed s///g)curl http://127.0.0.1:9180/apisix/admin/routes/1 -H X-API-KEY: $admin_key -X PUT -d { uri: /hello, plugins: { openwhisk: { api_host: http://localhost:3233, service_token: 23bc46b1-71f6-4ed5-8c54-816aa4f8c502:123zO3xZCLrMN6v2BKK1dXYFpXlPkccOFqm12CdAsMgRU4VrNZ9lyGVCGuMDGIwP, namespace: guest, action: test } } }这里通过 Admin API默认 9180 端口向/apisix/admin/routes/1发送 PUT 请求创建路由1uri为/hello命中该 URI 的请求都会触发 openwhisk 插件调用命名空间guest下的testaction。schema 校验的行为验证配置写入时会经过check_schema校验。测试用例 t/plugin/openwhisk.t 覆盖了典型场景TEST 1最小合法配置api_host、service_token、namespace、action四项齐全可通过校验TEST 2缺少api_host时报错property api_host is requiredTEST 3api_host类型错误传数字 3233时报错property api_host validation failed: wrong type: expected string, got number。Example usage调用示例插件配置完成后向该路由发送请求即可触发对应 actioncurl -i http://127.0.0.1:9080/hello其中 9080 是 APISIX 数据面默认的 HTTP 端口。请求会被插件转发到 OpenWhisk并返回 action 的执行结果{ ready: true }不同请求形态与错误场景结合测试用例可以进一步了解插件对各种请求的处理GET 请求TEST 6 验证 GET/hello返回{hello:test}说明 action 收到 GET 请求时也能正常执行并返回结果。POST JSON 请求体TEST 9 验证POST /hello且请求体为{name: world}时请求体被透传给 action返回{hello:world}即 action 可以读取到客户端传入的参数。POST 非 JSON 请求体TEST 7 验证当Content-Type: application/x-www-form-urlencoded且请求体为testtest时OpenWhisk 返回 400The request content was malformed因为 action 期望的是 JSON 格式。action 不存在TEST 11 验证指向不存在的 action 时返回 404The requested resource does not exist.。api_host 不可达TEST 13 验证当 OpenWhisk 地址错误如127.0.0.1:1979时返回 503且错误日志中出现failed to process openwhisk action, err:。包内 actionTEST 14/15 验证配置了package: pkg后请求会命中包内的 actiontestpkg返回{hello:world}对应端点路径中会带上pkg/段。上述行为均可在 t/plugin/openwhisk.t 中找到对应用例可作为排查线上问题的参考基线。Delete Plugin移除插件要移除openwhisk插件只需从 Route 的插件配置中删除对应的 JSON 配置即可。APISIX 会自动重新加载配置无需重启即可生效。下面的示例把路由1重置为一个普通的 roundrobin 上游路由不再挂载任何插件curl http://127.0.0.1:9180/apisix/admin/routes/1 -H X-API-KEY: $admin_key -X PUT -d { methods: [GET], uri: /index.html, upstream: { type: roundrobin, nodes: { 127.0.0.1:1980: 1 } } }由于 APISIX 的配置热更新机制该操作即时生效此后/index.html的请求将直接转发到127.0.0.1:1980节点不再经过 OpenWhisk。总结openwhisk插件为 APISIX 提供了与 OpenWhisk 无服务器平台的无缝集成能力通过 Route 级配置即可将任意 HTTP 请求转译为对 OpenWhisk action 的同步调用并支持自定义响应头、状态码与响应体透传同时内置了 token 加密存储、TLS 校验警告、连接池与超时控制等生产级细节。若需深入了解其实现与边界行为可直接阅读插件源码 apisix/plugins/openwhisk.lua 与完整测试套件 t/plugin/openwhisk.t。【免费下载链接】apisixThe Cloud-Native API Gateway项目地址: https://gitcode.com/GitHub_Trending/ap/apisix创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表