假设我们希望在请求到达后端服务之前,添加一个自定义的 HTTP 头部,并在响应返回客户端之前,记录响应的状态码。
配置示例
以下是 Envoy 的部分配置,展示了如何使用 envoy.filters.http.lua
过滤器来实现上述功能。
static_resources:
listeners:
- name: listener_0
address:
socket_address:
address: 0.0.0.0
port_value: 8080
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
'@type': type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
stat_prefix: ingress_http
route_config:
name: local_route
virtual_hosts:
- name: backend
domains: ["*"]
routes:
- match:
prefix: "/"
route:
cluster: backend_service
http_filters:
- name: envoy.filters.http.lua
typed_config:
'@type': type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua
inline_code: |
function envoy_on_request(handle)
-- 添加自定义请求头
handle:requestHeaders():add("x-custom-header", "envoy")
end
function envoy_on_response(handle)
-- 记录响应状态码
local status = handle:headers():get(":status")
handle:logInfo("Response status: " .. status)
end
- name: envoy.filters.http.router
解释
-
envoy.filters.http.lua:这是一个可以在请求和响应期间执行 Lua 脚本的过滤器。我们在其中定义了两个函数:
envoy_on_request
和envoy_on_response
。-
envoy_on_request:在请求阶段执行,添加自定义头部
x-custom-header
,值为envoy
。 -
envoy_on_response:在响应阶段执行,获取并记录响应的状态码。
-
-
过滤器执行顺序:
- 当请求到达时,
lua
过滤器首先执行envoy_on_request
函数,添加自定义头部。 - 然后请求通过
router
过滤器,被路由到上游服务backend_service
。 - 当上游服务返回响应时,
lua
过滤器执行envoy_on_response
函数,记录响应状态码。 - 最后,响应返回给客户端。
- 当请求到达时,
工作流程
-
客户端请求:客户端向 Envoy 发送 HTTP 请求。
-
添加自定义头部:
lua
过滤器的envoy_on_request
函数捕获请求,添加x-custom-header: envoy
到请求头部。 -
请求路由:
router
过滤器将修改后的请求路由到指定的上游集群backend_service
。 -
上游响应:上游服务处理请求并返回响应。
-
记录状态码:
lua
过滤器的envoy_on_response
函数捕获响应,获取响应状态码并记录日志。 -
响应返回客户端:Envoy 将响应发送回客户端。
注意事项
-
过滤器链的配置顺序很重要:
lua
过滤器必须在router
过滤器之前配置,以确保请求阶段的脚本在请求被路由之前执行,响应阶段的脚本在响应返回给客户端之前执行。 -
日志记录:
handle:logInfo
函数用于记录日志,方便调试和监控。 -
可扩展性:使用 Lua 脚本可以快速实现自定义的请求和响应处理逻辑,而无需编写和编译 C++ 扩展。