OpenResty Edge 中,您可以先在 Admin Web 控制台中创建一个全局 Lua 模块(上传 .lua 文件或在编辑框中在线编写),再通过 Edgelang 在页面规则中调用它。保存后,模块会自动分发到每台网关服务器,无需重载或重启即可在 Edgelang 代码中引用。

本视频教程将演示如何创建全局 Lua 模块、通过 Edgelang 在页面规则中调用它,并用 curl 验证结果——让您轻松完成极其复杂的网关操作和计算。Edge 语言是由 OpenResty Inc. 开发的一种简洁而强大的小语言。

在 OpenResty Edge 中通过 Edgelang 调用 Lua 模块

如何在 OpenResty Edge 中创建全局 Lua 模块

让我们进入 OpenResty Edge 的 Admin Web 控制台。这是我们控制台的样例部署。每个用户都有自己的本地部署。

OpenResty Edge 控制台的样例部署

首先,我们需要创建一个 Lua 模块。

在 OpenResty Edge 控制台中创建新的 Lua 模块

进入到全局配置页面。

进入 OpenResty Edge 控制台的全局配置页面

选择 “全局 Lua 模块”。

在全局配置中选择全局 Lua 模块

我们在这里创建的 Lua 模块可以被页面规则调用,并且可以尽可能地满足我们复杂的需求。

可供页面规则调用的全局 Lua 模块列表

我们可以直接上传一个 Lua 文件。

直接上传一个 .lua 文件到全局 Lua 模块

或者在编辑框中编写代码。

在编辑框中在线编写 Lua 模块代码

在这里,我们创建了一个名为 output-md5.lua 的 Lua 文件,它可以计算输入参数的 md5 值。

创建用于计算 md5 值的 output-md5.lua

声明 Lua 模块表 _M

声明 Lua 模块表 _M

现在向该 Lua 模块添加一个名为 calc 的函数,该函数可以计算输入参数的 md5 值。

添加计算输入 md5 值的 calc 函数

最后,不要忘记在结尾处返回模块表。

在结尾返回 Lua 模块表 _M

编辑并保存后,Lua 模块将自动分发到每个网关服务器,并且可以由 Edgelang 代码引用。

保存 Lua 模块使其分发到每台网关服务器

这些全局 Lua 模块可在多个页面规则间复用。若需事件驱动的逻辑,OpenResty Edge 还支持响应网关服务器下线事件的 Lua 扩展

如何通过 Edgelang 在页面规则中调用 Lua 模块

现在,我们尝试在 OpenResty Edge 的 HTTP 应用程序中调用 Lua 模块。

在 OpenResty Edge 中打开 HTTP 应用以调用 Lua 模块

我们可以继续使用之前的示例应用,test-edge.com。

test-edge.com 示例 HTTP 应用

进入该应用。

进入 HTTP 应用设置

我们已经定义了一个页面规则。

打开应用的页面规则

该页面规则设置了一个反向代理到预定义的上游。

已有的页面规则设置了到上游的反向代理

现在让我们添加一个新的页面规则来调用 Lua 模块。

添加调用 Lua 模块的新页面规则

启用一个规则条件来检查 URI /test-md5

启用匹配 URI /test-md5 的规则条件

看看我们可以选择哪些变量。

从可选的请求变量中选择

选择 “URI”。

为条件选择 URI 变量

我们选择字符串相等运算符。

选择字符串相等运算符

配置 URI 相等条件

输入值 /test-md5,仅匹配根位置。

输入 /test-md5 作为 URI 匹配值

然后添加一个新动作。

为页面规则添加新动作

您可以在此处搜索要添加的动作。

搜索要添加的页面规则动作

搜索 “使用 EdgeLang”。

搜索“使用 EdgeLang”动作

选择它。

选择“使用 EdgeLang”动作

将我们用于调用 Lua 模块的 Edgelang 代码添加到编辑框中,注意我们使用 URI 参数 “value” 作为输入参数。

添加用 value URI 参数调用 Lua 模块的 Edgelang 代码

确保这个规则在任何现有的正常规则之前运行。

让该规则在现有正常规则之前运行

确保在匹配此规则时跳过所有后续规则。

设置匹配该规则时跳过后续规则

这对于此规则并不是必需的。但是,当我们想立即停止处理请求时,最好明确指定。

现在创建这个规则。

创建页面规则

像往常一样,需要发布一个新的版本来推送我们刚才的改动。

发布新版本以推送改动

点击这个按钮。

点击发布按钮

发布!

确认并发布新版本

新版本现在已经同步到所有的网关服务器上了。

新版本已同步到所有网关服务器

现在,新的页面规则已经被推送到所有的网关集群和服务器。

页面规则已推送到所有网关集群和服务器

我们的配置变化不需要服务器重载、重启或二进制升级。所以它是非常高效和可扩展的。

配置变更无需重载、重启或二进制升级

如何用 curl 验证 Lua 模块的输出

接下来,我们将验证调用 Lua 模块的效果。

在终端上,我们通过 “curl” 命令行工具向此网关服务器发送 HTTP 请求。

用 curl 向网关服务器发送 HTTP 请求

这里我们发送一个带有 URI 参数 value=test1 的请求。请注意 value=test1 URI 参数。

带 URI 参数 value=test1 的 curl 请求

运行命令。我们可以获得返回的 md5 值。

value=test1 返回的 md5 值

现在我们更改 URI 参数。请注意 value=test2 URI 参数。

带 URI 参数 value=test2 的 curl 请求

运行它!可以看到返回的 md5 值已更改。

value=test2 返回的、已改变的 md5 值

我们还可以在页面规则开头调用 Lua 模块。

在页面规则的开头调用 Lua 模块

在此处添加 Edgelang 代码。

在页面规则开头添加 Edgelang 代码

点击 “编辑” 按钮。

点击“编辑”按钮以添加 Edgelang 代码

在编辑框中编写 Edgelang 代码。

在编辑框中编写 Edgelang 代码

这跟我们刚才新加的页面规则效果一样。

Lua 模块调用的效果与专用页面规则相同

关于 OpenResty Edge

OpenResty Edge 是一款专为微服务和分布式流量架构设计的全能型网关软件,由我们自主研发。它集流量管理、私有 CDN 构建、API 网关、安全防护等功能于一体,帮助您轻松构建、管理和保护现代应用程序。OpenResty Edge 拥有业界领先的性能和可扩展性,能够满足高并发、高负载场景下的苛刻需求。它支持调度 K8s 等容器应用流量,并可管理海量域名,轻松满足大型网站和复杂应用的需求。

常见问题

如何在 OpenResty Edge 中创建 Lua 模块?

进入 Admin Web 控制台,打开全局配置 → 全局 Lua 模块,上传一个 .lua 文件或在编辑框中在线编写。声明模块表 _M,添加函数(示例中定义了一个计算输入 md5 值的 calc 函数),并在结尾返回 _M。保存后,模块会自动分发到每台网关服务器。

如何通过 Edgelang 调用 Lua 模块?

在页面规则中添加动作并搜索 “使用 EdgeLang”,然后编写调用模块函数的 Edgelang 代码。示例中,规则匹配 URI /test-md5,并把 value URI 参数作为输入传给模块。您也可以在页面规则的最开头调用该模块。

修改 Lua 模块后需要重载或重启 OpenResty Edge 吗?

不需要。保存全局 Lua 模块会将其分发到每台网关服务器,发布新版本会把页面规则同步到所有网关集群。配置变更无需服务器重载、重启或二进制升级。

可以在页面规则的开头调用 Lua 模块吗?

可以。除了在匹配的规则内调用外,您还可以添加 Edgelang 代码,在页面规则的最开头调用模块;其效果与上文的专用规则相同。

如果你喜欢这个教程,请订阅这个博客网站和我们的 YouTube 频道B 站频道。谢谢!

关于作者

章亦春是开源 OpenResty® 项目创始人兼 OpenResty Inc. 公司 CEO 和创始人。

章亦春(Github ID: agentzh),生于中国江苏,现定居美国湾区。他是中国早期开源技术和文化的倡导者和领军人物,曾供职于多家国际知名的高科技企业,如 Cloudflare、雅虎、阿里巴巴, 是 “边缘计算“、”动态追踪 “和 “机器编程 “的先驱,拥有超过 22 年的编程及 16 年的开源经验。作为拥有超过 4000 万全球域名用户的开源项目的领导者。他基于其 OpenResty® 开源项目打造的高科技企业 OpenResty Inc. 位于美国硅谷中心。其主打的两个产品 OpenResty XRay(利用动态追踪技术的非侵入式的故障剖析和排除工具)和 OpenResty Edge(最适合微服务和分布式流量的全能型网关软件),广受全球众多上市及大型企业青睐。在 OpenResty 以外,章亦春为多个开源项目贡献了累计超过百万行代码,其中包括,Linux 内核、Nginx、LuaJITGDBSystemTapLLVM、Perl 等,并编写过 60 多个开源软件库。

关注我们

如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:

我们的微信公众号

翻译

我们提供了英文版原文和中译版(本文)。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!