Openresty实现获取内部location
Posted one-villager
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Openresty实现获取内部location相关的知识,希望对你有一定的参考价值。
-- 三种方式实现获取内部location信息
--[[
location /api1 {
echo_sleep 3;
echo api1: $arg_a;
}
location /api2 {
echo_sleep 3;
echo api2: $arg_a;
}
]]
-- 串行实现
local t1 = ngx.now()
local res1 = ngx.location.capture("/api1", {args = ngx.req.get_uri_args()})
local res2 = ngx.location.capture("/api2", {args = ngx.req.get_uri_args()})
local t2 = ngx.now()
ngx.print(res1.body, "<br/>", res2.body, "<br/>", tostring(t2 - t1))
-- ngx.location.capture_multi实现
-- 直接使用ngx.location.capture_multi来实现,比如访问http://192.168.1.2/concurrency1?a=22
local t1 = ngx.now()
local res1, res2 = ngx.location.capture_multi(
{
{"/api1", {args = ngx.req.get_uri_args()}},
{"/api2", {args = ngx.req.get_uri_args()}}
})
local t2 = ngx.now()
ngx.print(res1.body, "<br/>", res2.body, "<br/>", tostring(t2 - t1))
-- 协程API
-- 使用ngx.thread.spawn创建一个轻量级线程,然后使用ngx.thread.wait等待该线程的执行成功。比如访问http://192.168.1.2/concurrency2?a=22
local t1 = ngx.now()
local function capture(uri, args)
return ngx.location.capture(uri, args)
end
local thread1 = ngx.thread.spawn(capture, "/api1", {args = ngx.req.get_uri_args()})
local thread2 = ngx.thread.spawn(capture, "/api2", {args = ngx.req.get_uri_args()})
local ok1, res1 = ngx.thread.wait(thread1)
local ok2, res2 = ngx.thread.wait(thread2)
local t2 = ngx.now()
ngx.print(res1.body, "<br/>", res2.body, "<br/>", tostring(t2 - t1))
-- 我们可以通过下面的方式实现任意一个成功即返回,之前的是等待所有执行成功才返回。
local ok, res = ngx.thread.wait(thread1, thread2)
以上是关于Openresty实现获取内部location的主要内容,如果未能解决你的问题,请参考以下文章
OpenResty之replace-filter-nginx-module