在 OpenResty Edge 中如何使用 EdgeLang
今天我将演示 OpenResty Edge 的另一个很酷的功能。就是如何使用我们基于规则的小语言,即 Edge 语言,简称 Edgelang。
Edgelang 简介
用户可以使用 Edgelang 来编写复杂的网关规则,用于自定义认证、重写请求和响应、配置动态上游路由等等。这些规则的运行速度通常要比手写的 Lua 代码快很多。Edgelang 编译器会生成高效的原生代码,在网关服务器上运行。
Edgelang 编译器是非常高效的。它实现了许多先进的优化技术。它支持将所有 Edgelang 规则所引用的正则表达式合并到一个状态机中。这样只需扫描一次请求数据,就会立即知道能匹配上哪些规则以及这些规则的哪些部分。
它还支持把所有 Edgelang 规则的常量字符串前缀和后缀模式组合成单一的树状数据结构。
添加使用 Edgelang 定义的页面规则
让我们进入 OpenResty Edge 的 Admin Web 控制台。这就是我们控制台的样本部署。每个用户都有自己的本地部署。
我们可以继续使用之前的示例应用,test-edge.com。
进入该应用。
在之前的教程中我们已经创建了一个页面规则。
这个页面规则设置了一个反向代理到一个上游。
可以在这里添加我们的 Edgelang 代码。
现在来添加第一条规则。
首先是规则的条件部分。条件是当 URI 是 “/foo/” 时。
用箭头来标志条件部分的结束。
箭头之后,我们指定当条件得到满足时要执行的动作。
这个动作启动了一个 HTTP 重定向到 “/bar/” 页面。
保存这个规则。
正如我们看到的那样,Edgelang 规范由规则组成。每个规则都有两个基本部分:
一个是条件部分,
另外一个是由动作组成的结果。
条件和结果由一个箭头连接。
整个规则以一个分号结束。
这只是一个最简单的规则。我们可以随意添加各种规则。一条规则可以有多个条件,各个条件之间可以用 AND 或者 OR 连接。一条规则在其结果部分也可以执行多个动作。
像往常一样,需要发布一个新的版本来推送我们刚才的改动。
点击这个按钮。
发布!
新版本现在已经同步到所有的网关服务器上了。
现在,新的页面规则已经被推送到所有的网关集群和服务器。
这些配置的变化不需要服务器重载、重启或二进制升级。所以它是非常高效和可扩展的。
测试
在终端上,我们通过 curl
命令行工具向一个由 DNS 解析的网关服务器发送 HTTP 请求。
curl -I http://test-edge.com/bar/
请注意响应头没有重定向。
接下来,让我们发送一个带有 /foo/
URI 的 HTTP 请求。
curl -I http://test-edge.com/foo/
可以看到这个请求已经被重定向了。
它被重定向到 /bar/ 这个位置。刚才定义的 Edgelang 规则生效了!
让我们测试另一个前缀为 “/foo/” 的 URI。
这个 URI 有一个额外的后缀,“blah/"。
发送请求。
可以看到这个请求并没有命中 Edgelang 规则。这是因为我们的 Edgelang 条件需要完全匹配 “/foo/"。
修改页面规则的 Edgelang 定义
我们可以修改 Edgelang 规则中的条件部分来处理这种情况。
单击 “编辑” 按钮。
删除原来的条件。
将其改为匹配 URI 前缀 “/foo/"。
保存这个规则。
再做一次新配置的发布。
回到终端。再次发送我们之前的测试请求。
仍然采用 “blah/” URI 的后缀。
发送请求。
可以看到它触发了一个重定向,这次是命中了我们的 Edgelang 规则。
接下来,让我们发送一个没有任何额外 URI 后缀的 HTTP 请求。
curl -I http://test-edge.com/foo/
仍然能够命中。
使用 Edgelang 定义 WAF 规则
我们可以在 Web 控制台的许多不同地方使用 Edgelang。例如,可以用 EdgeLang 为 WAF,或 Web 应用防火墙添加自定义规则。
创建一个新的 WAF 规则。
在这里写入 Edgelang。
Edgelang 用户手册
Edgelang 是一种非常强大的语言,有很多特性。
如需了解更多,欢迎阅读 Edgelang 用户手册。
手册里有许多代码实例。
非常详细地介绍了 Edgelang 的各种用法。
这就是我今天要讲的内容。
如果你喜欢这个教程,请订阅这个博客网站和我们的 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、LuaJIT、GDB、SystemTap、LLVM、Perl 等,并编写过 60 多个开源软件库。
关注我们
如果您喜欢本文,欢迎关注我们 OpenResty Inc. 公司的博客网站 。也欢迎扫码关注我们的微信公众号:
翻译
我们提供了英文版原文和中译版(本文) 。我们也欢迎读者提供其他语言的翻译版本,只要是全文翻译不带省略,我们都将会考虑采用,非常感谢!