今天我将演示 OpenResty Edge 的另一个很酷的功能。就是如何使用我们基于规则的小语言,即 Edge 语言,简称 Edgelang。

Edgelang 简介

用户可以使用 Edgelang 来编写复杂的网关规则,用于自定义认证、重写请求和响应、配置动态上游路由等等。这些规则的运行速度通常要比手写的 Lua 代码快很多。Edgelang 编译器会生成高效的原生代码,在网关服务器上运行。

Edgelang 编译器是非常高效的。它实现了许多先进的优化技术。它支持将所有 Edgelang 规则所引用的正则表达式合并到一个状态机中。这样只需扫描一次请求数据,就会立即知道能匹配上哪些规则以及这些规则的哪些部分。

它还支持把所有 Edgelang 规则的常量字符串前缀和后缀模式组合成单一的树状数据结构。

添加使用 Edgelang 定义的页面规则

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

Screenshot

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

Screenshot

进入该应用。

Screenshot

在之前的教程中我们已经创建了一个页面规则。

Screenshot

这个页面规则设置了一个反向代理到一个上游。

Screenshot

可以在这里添加我们的 Edgelang 代码。

Screenshot

现在来添加第一条规则。

Screenshot

首先是规则的条件部分。条件是当 URI 是 “/foo/” 时。

Screenshot

用箭头来标志条件部分的结束。

Screenshot

箭头之后,我们指定当条件得到满足时要执行的动作。

Screenshot

这个动作启动了一个 HTTP 重定向到 “/bar/” 页面。

Screenshot

保存这个规则。

Screenshot

正如我们看到的那样,Edgelang 规范由规则组成。每个规则都有两个基本部分:

Screenshot

一个是条件部分,

Screenshot

另外一个是由动作组成的结果。

Screenshot

条件和结果由一个箭头连接。

Screenshot

整个规则以一个分号结束。

Screenshot

这只是一个最简单的规则。我们可以随意添加各种规则。一条规则可以有多个条件,各个条件之间可以用 AND 或者 OR 连接。一条规则在其结果部分也可以执行多个动作。

Embeded image

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

Screenshot

点击这个按钮。

Screenshot

发布!

Screenshot

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

Screenshot

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

Embeded video

Embeded video

Embeded video

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

Embeded image

测试

在终端上,我们通过 curl 命令行工具向一个由 DNS 解析的网关服务器发送 HTTP 请求。

curl -I http://test-edge.com/bar/

Screenshot

请注意响应头没有重定向。

Screenshot

接下来,让我们发送一个带有 /foo/ URI 的 HTTP 请求。

curl -I http://test-edge.com/foo/

Screenshot

可以看到这个请求已经被重定向了。

Screenshot

它被重定向到 /bar/ 这个位置。刚才定义的 Edgelang 规则生效了!

Screenshot

让我们测试另一个前缀为 “/foo/” 的 URI。

Screenshot

这个 URI 有一个额外的后缀,“blah/"。

Screenshot

发送请求。

Screenshot

可以看到这个请求并没有命中 Edgelang 规则。这是因为我们的 Edgelang 条件需要完全匹配 “/foo/"。

Screenshot

修改页面规则的 Edgelang 定义

我们可以修改 Edgelang 规则中的条件部分来处理这种情况。

Screenshot

单击 “编辑” 按钮。

Screenshot

删除原来的条件。

Screenshot

将其改为匹配 URI 前缀 “/foo/"。

Screenshot

保存这个规则。

Screenshot

再做一次新配置的发布。

Screenshot

Screenshot

Screenshot

Screenshot

回到终端。再次发送我们之前的测试请求。

Screenshot

仍然采用 “blah/” URI 的后缀。

Screenshot

发送请求。

Screenshot

可以看到它触发了一个重定向,这次是命中了我们的 Edgelang 规则。

Screenshot

接下来,让我们发送一个没有任何额外 URI 后缀的 HTTP 请求。

curl -I http://test-edge.com/foo/

Screenshot

仍然能够命中。

Screenshot

使用 Edgelang 定义 WAF 规则

我们可以在 Web 控制台的许多不同地方使用 Edgelang。例如,可以用 EdgeLang 为 WAF,或 Web 应用防火墙添加自定义规则。

Screenshot

Screenshot

创建一个新的 WAF 规则。

Screenshot

在这里写入 Edgelang。

Screenshot

Edgelang 用户手册

我们自主设计的 EdgeLang 网关小语言是一种非常强大的语言,有很多特性。语言支持调用自定义 Lua 模块和 Lua 代码,或者任意 .so 动态链接库。其编译器支持跨规则深度优化。

Screenshot

如需了解更多,欢迎阅读 Edgelang 用户手册英文版更完整更新一些。

Screenshot

手册里有许多代码实例。

Screenshot

非常详细地介绍了 Edgelang 的各种用法。

Screenshot

这就是我今天要讲的内容。

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

关于本文和关联视频

本文和相关联的视频都是完全由我们的 OpenResty Showman 产品从一个简单的剧本文件自动生成的。

关于作者

章亦春是开源 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. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:

我们的微信公众号

翻译

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