apisix~fault-injection條件式異常響應
- https://apisix.apache.org/zh/docs/apisix/plugins/fault-injection/
- https://github.com/apache/apisix/issues/9203
這個插件就是做異常返回的事的,不要使用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)
變量可以是:
-
預定義的變量:
"arg_name":請求參數"http_header_name":HTTP 頭"cookie_name":Cookie"var_name":Nginx 變量
-
嵌套變量訪問:
"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
注意事項
- 表達式在內部會被編譯為高效的 Lua 代碼
- 支持短路求值(short-circuit evaluation)
- 變量名中的
-會被替換為_(例如http_x_forwarded_for)
lua-resty-expr 提供了一種靈活而強大的方式來描述復雜條件邏輯,特別適合在 OpenResty 的上下文中進行流量控制和路由決策。
浙公網安備 33010602011771號