apisix lua插件开发记录

1 如何匹配路径中的参数

文章给出了具体的方法,但有隐藏的坑未提及。

router radixtree_uri_with_parameter 启用后,对路径上的参数名有要求,不能有_。否则会提示404,因为 router radixtree_uri_with_parameter解析不了。

2 插件中的默认参数未生效

经过插件的请求的各拦截点见官方文档:https://apisix.apache.org/docs/apisix/architecture-design/apisix/

lua插件的关键组成

  1. require
  2. schema 插件的规约,apisix根据 schema处理插件的配置。
  3. name 定义插件的名称
  4. _M 定义的一个lua的module,最终返回给框架层。
  5. _M.check_schema 检查schema,对conf设置默认值。
  6. _M.access 检查进入的请求,根据不同的需求,实现不同步骤的拦截接口,如proxy、rewrite等

一开始未理解check_schema的作用,未实现它,结果发现在schema中定义的默认参数并没有生效。实现这个函数就行了。

复制代码
function _M.check_schema(conf)
    return core.schema.check(schema, conf)
end

官方文档也没描述默认参数的处理。因为它从命令看,只是为了检查配置是否符合schema。

3 请求提前返回中止

在 access 中完成检查后,我直接return 200, "ok"了。结果请求未到后端服务。想要请求继续到后端服务,要只return。不返回具体的状态码。

至少我没在apisix官网没找到对应的文档。文档只说了不要提前返回,继续请求应该返回什么,并没有准确的描述。

4 使用ingress-controller时,路由CR如何生效

一开始不知道如何生效,后来想可能需要重启ingress-controller,果然重启一下就可以了。

复制代码
kubectl rollout restart deploy apisix-ingress-controller

5 日志

apisix的默认日志等级是warn级别,也就是说你在lua中加的info级别是在apisix日志中看不到。

6 lua脚本修改生效

目前看apisix并不支持这种热加载。需要重启apisix容器,但脚本都是在容器镜像里的。所以调试时,需要反复打镜像,效率并不高。

可以这样:把脚本的目录挂载到Pod里,然后修改脚本后,重启Pod就行了。注意重启顺序:

  1. 重启 apisix,让脚本生效。
  2. 重启 apisix-ingress-controller 让路由生效。
相关推荐
努力努力再努力wz1 天前
【Lua进阶系列】Lua 调试机制详解:从虚拟机调用栈、错误传播到 debug 库
junit·单元测试·lua
炸薯条!3 天前
博客系统测试报告
开发语言·lua
BuHuaX5 天前
Lua 与 ToLua:运行机制及热更新原理
开发语言·unity·junit·c#·lua
努力努力再努力wz5 天前
【Lua 入门系列】模块与包(一):从多文件组织到require 运行时加载机制、模块缓存、预加载搜索与 Lua 文件搜索机制
开发语言·junit·lua
UWA5 天前
多人战斗中Lua持续高耗时,是瞬时峰值还是高频调用在作祟
性能优化·lua·游戏开发
努力努力再努力wz6 天前
【Lua 入门系列】从执行模型到事件驱动:一文理解 Lua 有栈协程、挂起恢复与协作式调度
开发语言·lua
努力努力再努力wz7 天前
【Lua 入门系列】Lua数据结构:从 Table 出发,一文串联数组、链表、栈、队列、集合、映射与树的实现原理
数据结构·链表·lua
努力努力再努力wz7 天前
【Lua入门系列】从 Table 到元表与元方法:一文理解 Lua 的行为扩展机制
开发语言·junit·lua
麻瓜code8 天前
秒杀优化三连:Lua + 阻塞队列 + Redis Stream,响应从 3.4 秒到毫秒级
redis·junit·lua
努力努力再努力wz8 天前
【Lua 入门系列】Lua 函数深入理解:函数对象、多返回值、可变参数、闭包、递归与尾调用优化
开发语言·lua