如何在nginx中复制请求,并且指定发送比例,同时能拿到response body?
我使用了mirror模块复制请求,并在upstream中指定了weight,从而控制发送比例到mirror。但是我同时需要拿到mirror的response body。
我的思路是放弃mirror模块,直接使用Lua脚本来发送请求。这样可以拿到response body了,但是我没办法控制请求weight,也就是发送比例。
我想要将请求复制一份请求,同时复制的请求中有30%的请求发送给我的一个下游服务Shadow1,70%的请求发给一个默认的服务。我需要拿到Shadow1的所有response body。
考虑直接使用Lua脚本,在主请求中(非mirror),添加Lua,并且在Lua中写代码,发送子请求给Shadow1。记录Shadow1的response body。但是,Lua脚本似乎没有什么合适的办法指定30%的比例发送给Shadow1,而70%发送给默认服务。
请问该如何实现这个需求呢?需要复制请求,并且指定复制的比例,同时还要拿到response body
我的lua文件
local http = require "resty.http"
local httpc = http.new()
local ngx_log = ngx.log
local ngx_ERR = ngx.ERR
local res = ngx.location.capture("/mirror1", {
method = ngx.var.request_method,
body = ngx.var.request_body,
args = ngx.req.get_uri_args(),
headers = ngx.req.get_headers(),
})
if res.status == 200 then
ngx.status = res.status
ngx_log(ngx_ERR, "Response Body=========:", res.body)
else
ngx.status = 500
end
--local url = "https://aiplatform.dev52.cbf.dev.paypalinc.com/bizlogging/insert?model_id=model_id"
--local body = '{"metadata_schema": ["request_body"],"variable_schema": ["response_body"]}'
--local headers = {
-- ["Content-Type"] = "application/json",
-- ["accept"] = "*/*",
--}
--
--local res, err = httpc:request_uri(url, {
-- method = "POST",
-- body = body,
-- headers = headers,
-- ssl_verify = false,
-- timeout = 1000,
--})
if not res then
ngx_log(ngx_ERR, "failed to request: ", err)
return
end
ngx.status = res.status
--ngx_log(ngx_ERR, "success to request:", ngx.status)
httpc:set_keepalive()