apisix~fault-injection条件式异常响应

这个插件就是做异常返回的事的,不要使用traffic-split来做这种事

  • 可以根据请求头,查询参数,来动态响应一个异常信息

核心参数

  • abort.vars 执行故障注入的规则,当规则匹配通过后才会执行故障注。vars 是一个表达式的列表,来自 lua-resty-expr。

注意:

  • 从原码中可以看到,fault-injection插件的优先级非常高,是11000,所以,当你使用这个插件时,如果发现配置未生效,可以修改在使用时重新配置它的优先级即可。
  • fault-injection插件中的vars条件可能依赖于其它插件处理的结果,所以需要降低fault-injection的优先级。

实例如下

  • 请求参数中name为jack的,直接返回403
  • 请求头中,age为18的,直接返回403
 "fault-injection": {
   "_meta": {
        "disable": false,
        "priority": 1
      },
    "abort": {
        "http_status": 403,
        "body": "Fault Injection!\n",
        "vars": [
            [
                [ "arg_name","==","jack" ]
            ]
        ]
    },
    "delay": {
        "duration": 2,
        "vars": [
            [
                [ "http_age","==","18" ]
            ]
        ]
    }
 }
        

lua-resty-expr 语法介绍

lua-resty-expr 是 OpenResty 中的一个库,用于构建复杂的条件表达式,常用于流量路由、访问控制等场景。它提供了一种声明式的 DSL 来描述条件逻辑。

基本语法结构

lua-resty-expr 的基本表达式是一个 Lua 表(table),由操作符和操作数组成:

local expr = require "resty.expr"
local ex = expr.new({
    {op, var, val},
    {op, var, val},
    -- 更多条件...
})

操作符 (op)

支持的操作符包括:

  • 比较操作符:

    • "==":等于
    • "~=":不等于
    • ">":大于
    • ">=":大于等于
    • "<":小于
    • "<=":小于等于
    • "in":包含于
    • "not in":不包含于
  • 逻辑操作符:

    • "and":逻辑与
    • "or":逻辑或
    • "not":逻辑非
  • 其他操作符:

    • "starts_with":以...开头
    • "ends_with":以...结尾
    • "contains":包含
    • "matches":正则匹配

变量 (var)

变量可以是:

  1. 预定义的变量:

    • "arg_name":请求参数
    • "http_header_name":HTTP 头
    • "cookie_name":Cookie
    • "var_name":Nginx 变量
  2. 嵌套变量访问:

    • "arg.user.name":访问嵌套参数

值 (val)

值可以是:

  • 字符串
  • 数字
  • 布尔值
  • 表(用于 in 操作)
  • 正则表达式(用于 matches 操作)

示例

简单比较

local ex = expr.new({
    {"==", "arg_foo", "bar"},  -- GET 参数 foo 等于 "bar"
    {"==", "http_x_api_key", "12345"},  -- X-API-Key 头等于 "12345"
})

逻辑组合

local ex = expr.new({
    {"and", 
        {{"==", "arg_debug", "true"}},
        {{"==", "http_user_agent", "test_client"}}
    }
})

复杂条件

local ex = expr.new({
    {"or",
        {
            {"and",
                {{">=", "arg_age", 18}},
                {{"==", "arg_country", "US"}}
            }
        },
        {
            {"in", "arg_role", {"admin", "superuser"}}
        }
    }
})

字符串操作

local ex = expr.new({
    {"starts_with", "http_user_agent", "Mozilla/"},
    {"matches", "arg_email", [[^[^@]+@[^@]+\.[^@]+$]]}  -- 简单邮箱格式验证
})

使用表达式

创建表达式对象后,可以这样使用:

local ok, err = ex:eval(ngx.var)  -- 通常在 OpenResty 上下文中使用
if ok then
    -- 条件满足
else
    -- 条件不满足
end

注意事项

  1. 表达式在内部会被编译为高效的 Lua 代码
  2. 支持短路求值(short-circuit evaluation)
  3. 变量名中的 - 会被替换为 _(例如 http_x_forwarded_for

lua-resty-expr 提供了一种灵活而强大的方式来描述复杂条件逻辑,特别适合在 OpenResty 的上下文中进行流量控制和路由决策。

posted @ 2025-07-04 13:06  张占岭  阅读(15)  评论(0)    收藏  举报