istio - 特使过滤器拦截上游响应
问题描述
我已经为 envoy 编写了 ext_authz 过滤器,并且对 envoy 过滤器是如何完成的有基本的了解。但现在我想过滤从上游返回的响应。具体来说,我想处理两件事:
拦截来自上游的 data/jsonBody 并在 envoy 发送回下游之前根据某些业务规则过滤/修改 responseJsonBody。
如果上游关闭(当 http 响应代码 408-Timeout 时),我想将 post-request 保存到 async-msg-que 并将 202-Accepted 发送回下游。这样,当上游返回时,它将处理来自它的 async-msg-que 的未决后请求。
是否有一个现有的过滤器可以用于这些目的,或者使用 envoy-proxy sidecar 的正确方法是什么。
谢谢。
解决方案
您需要使用 lua 自己编写过滤器:
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: custom-filter
namespace: some-namespace
spec:
workloadSelector:
labels:
istio: ingressgateway
configPatches:
- applyTo: HTTP_FILTER
match:
context: GATEWAY
listener:
filterChain:
filter:
name: "envoy.filters.network.http_connection_manager"
subFilter:
name: "envoy.extAuthz" # name of your ext_authz filter
patch:
operation: INSERT_AFTER
value:
name: envoy.custom-resp
typed_config:
"@type": "type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua"
inlineCode: |
function envoy_on_response(response_handle)
if response_handle:headers():get(":status") == "408" then
-- send message depending on your queue, eg via httpCall()
-- Overwrite status and body
response_handle:headers():replace(":status", "202")
else
-- get response body as jsonString
local body = response_handle:body()
local jsonString = tostring(body:getBytes(0, body:length()))
-- do something, eg replace secret by regex
jsonString = jsonString:gsub("(foo|bar)", "")
response_handle:body():set(jsonString)
end
end
请注意,您需要以某种方式处理队列的超时。
推荐阅读
- javascript - Tinymce 编辑器中不显示图标
- android - Flutter 全局 BottomAppBar,每个 Page 有不同的 AppBar
- python - Numpy 切片功能:从数组形状 (X, 2) 动态创建切片索引 np.r_[a:b, c:d, ...] 以供在数组中选择
- c# - 如何在 API 控制器的集成测试中添加请求标头
- python - 如何重塑熊猫数据框仅线并增加价值
- php - PHP/PDO:SyntaxError:JSON.parse:JSON 数据第 1 行第 1 列的意外字符
- regex - 使用 reg exp 查找并列出名称中包含数字的文件
- python - 如何在python中将字符串'Jan 23 2016 10:30:08AM'或字符串'23/01/2016 10:30:08'转换为纪元时间?
- reactjs - 反应应用程序托管相同的端口
- amazon-web-services - 如何配置 AWS cloudWatchAgent 以递归方式从 EC2 实例上的文件夹收集日志?