如何在nginx中复制请求,并且指定发送比例(如30%),同时能拿到response body?

如何在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()
阅读 849
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏