lua 过滤器
网络过滤器(L3/L4)构成 Envoy 连接处理的核心,envoy更是借助于网络过滤器下的http连接管理器(L7)实现了大量的http特定功能。
除了功能强大的http连接管理器之外,envoy还内置了诸多的http过滤器(L7),用于自定义扩展http请求代理功能,如故障注入、外部授权、限流等。
其中lua过滤器允许在请求和响应流期间运行 Lua 脚本,该特性为扩展自定义处理流程预留了很大的操作空间。
当前lua过滤器支持的高级特性包括:
-
在流式传输的请求流和/或响应流中检查头部、正文和尾部。
-
修改头部和尾部。
-
阻塞并缓存整个请求/响应正文以进行检查。
-
对上游主机执行出站异步 HTTP 调用。可以在缓冲正文数据的同时执行此类调用,以便在调用完成时可以修改上游头部。
-
执行直接响应并跳过后续的过滤器迭代。例如,脚本可以向上游发起 HTTP 身份认证调用,然后直接响应 403 响应码。
配置
API引用参考官网。
过滤器在envoy配置中被引用名为envoy.filters.http.lua
。
基于每条路由的配置全局配置
默认情况下,定义在 inline_code
中的 Lua 脚本会被认定为 GLOBAL
脚本。
name: envoy.lua
typed_config:
"@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"
inline_code: |-
function envoy_on_request(request_handle)
-- lua处理脚本
end
function envoy_on_response(response_handle)
-- lua处理脚本
end
source_codes:
hello.lua:
inline_string: |
function envoy_on_request(request_handle)
request_handle:logInfo("Hello World.")
end
bye.lua:
inline_string: |
function envoy_on_response(response_handle)
response_handle:logInfo("Bye Bye.")
end
过滤器类型为type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua。
{
"inline_code": "...",
"source_codes": "{...}"
}
-
inline_code: 必填项,默认情况下,Envoy 将会在每个引用了
lua filter
的 HTTP 请求中执行inline_code
中的脚本,相当于是无条件匹配。 -
source_codes:
source_codes
中的配置则不会被默认执行,source_codes
相当于以Map的方式(key为脚本名称,value为脚本内容)为后续其他地方引用lua脚本提供源头。当
source_codes
中的脚本被引用时,将覆盖inline_code
中的处理脚本,即执行source_codes
中的脚本而不再执行inline_code
。
基于每条路由的配置
通过在虚拟主机、路由或加权集群上提供 LuaPerRoute 配置(属性typed_per_filter_config
),还可以基于每条路由禁用或覆盖 Lua HTTP 过滤器。
{
"disabled": "...",
"name": "...",
"source_code": "{...}"
}
-
disabled: 通