openresty中的ngx.location.capture和ngx.location.capture_multi的使用 | 落井下石


本站和网页 http://www.hangdaowangluo.com/archives/2712 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

openResty中的ngx.location.capture和ngx.location.capture_multi的使用 | 落井下石
落井下石 小树苗似得一天天成长 --> 菜单 跳至内容 首页 网络服务 Apache vsftpd Http Nginx Tomcat DNS 数据库 MySQL mongodb PostgreSQL MariaDB 操作系统 Linux Shell Docker 分布式集群 Redis CODIS ZOOKEEPER Hadoop Kafka RabbitMQ beanstalkd
ElasticSearch
Vagrant
大数据
Hbase
数据挖掘
配置管理
Git
Gerrit
GitLab
Jira
NGrinder
开发语言
C/C++
Go
lumen
PHP
Javascript
yaf
angular
nodeJs
css3
html5
workerman
OpenResty
微信小程序
算法
架构
HAProxy
Laravel
Lua
keepalived
composer
网络架构
硬件
AI
读书笔记
MySQL5.7中文手册
计算机组成与设计
openResty中的ngx.location.capture和ngx.location.capture_multi的使用
在openResty中,ngx.location.capture_multi是一个非常强大的功能。可以应用于并发多个相互之间没有依赖的请求。在现代的应用架构中经常使用微服务,提供低粒度的接口;但在客户端(例如:app、网页服务)经常需要请求多个微服务接口,才能完整显示页面内容。
例如:打开一个商品详情页,需要请求:
banner广告接口;
商品详情;
商品评论等。
那么ngx.location.capture_multi就派上大用场了,当然使用ngx.location.capture_multi不是唯一的办法,呵呵~。下面就来看看这个东东的用法;
先介绍一下下面这几个应用之间的差别;
ngx.exec:nginx跳转;跳转到其他的location中执行。但仅限nginx内部的location。
ngx.redirect:和nginx.exec相似,但支持外部跳转。
ngx.location.capture_multi:并发请求;但仅限nginx内部的location。
http包中multi方法:概念上与ngx.location.capture_multi相似,但支持外部接口。
一、ngx.location.capture
语法:
res = ngx.location.capture(uri, options?)
作用域:
rewrite_by_lua*, access_by_lua*, content_by_lua*
1.1 uri
直接看栗子:
location ~ /comment/([0-9]+) {
internal;
set $goodsId $1;
content_by_lua_block{
local args = ngx.req.get_uri_args()
ngx.say("comments for goodsId :", ngx.var.goodsId)
ngx.say("comments for goods:", args.offset)
location ~ /goods/detail/([0-9]+) {
default_type
plain/text;
local res = ngx.location.capture(
"/comment/"..ngx.var.goodsId.."?offset=0"
ngx.say(res.status)
ngx.say(res.body)
返回结果:
200
comments for goodsId :123123
comments for goods:0
1.2
options
method:
请求方法,默认为ngx.HTTP_GET
body: 请求内容,
仅限于string 或 nil
args: 请求参数,支持string 或 table
vars: 变量,仅限于table
ctx: 可参考中ngx.ctx的用法:
openResty中ngx_lua模块提供的API
copy_all_vars: 复制变量
share_all_vars: 共享变量
always_forward_body: 当设置为true时,父请求中的body转发到子请求。
默认是false,仅转发put和post请求方式中的body。如果设置body选项,则该设置失效。
1.2.1 always_forward_body
请看栗子:
栗子 01:
ngx.req.read_body();
local data = ngx.req.get_body_data()
ngx.say("comments for rank:", args.rank)
ngx.say("comments for data :", data)
local res = ngx.location.capture("/comment/"..ngx.var.goodsId.."?rank=5",{
method = ngx.HTTP_GET,
always_forward_body = false,
})
请求raw: uid=37A059714A2B4B4280794DCA5C150DF0,请看如下输出
comments for rank:5
comments for data :nil
栗子 01
中的:method = ngx.HTTP_GET ,更改成 method = ngx.HTTP_PUT或 method = ngx.HTTP_POST,请看如下输出:
comments for data :uid=37A059714A2B4B4280794DCA5C150DF0
重新将
中的 always_forward_body = false 更改成 always_forward_body = true,其他不变,请看如下输出:
结论 01:
always_forward_body:
当设置为true时,父请求中的body转发到子请求。设置为false,仅转发put和post
请求方式中的body.
继续更改
body = 'hello, world',
always_forward_body = false, --也可以设置为true
查看输出结果:
comments for data :hello, world
结论 02:
当选项中设置 body (只能为string)时,always_forward_body 选项失效。
1.2.2 args 和 vars
这一组的用法比较相似,放在一块讲了。看栗子吧。
栗子 02:
ngx.say("comments for args.a:", args.a)
ngx.say("comments for args.b:", args.b)
ngx.say("comments for vars.a:", ngx.var.a)
ngx.say("comments for vars.b:", ngx.var.b)
set $a '';
set $b '';
args = {a = "aa", b = "bb"},
vars = {a = "aa", b = "bb"},
输出结果:
comments for args.a:aa
comments for args.b:bb
comments for vars.a:aa
comments for vars.b:bb
从栗子 02 中可以看出,args 和 vars的区别。
结论 03 :
在发送参数到子请求中,一般参数使用 args;如特殊参数可以使用 vars,但也可以使用 args 代替。
1.23 ctx
请看栗子 03
栗子 03:
ngx.ctx.foo = "bar"
local c = {}
ctx = c,
ngx.say(c.foo)
ngx.say(ngx.ctx.foo)
bar
nil
1.24 copy_all_vars、share_all_vars
请看栗子04
栗子 04 :
set $dog "$dog world";
echo "$uri dog: $dog";
set $dog 'hello';
share_all_vars = true,
ngx.print(res.body)
ngx.say(ngx.var.uri, ": ", ngx.var.dog)
/comment/123123 dog: hello world
/goods/detail/123123/view: hello world
更改栗子 04 :更改 share_all_vars = true 成
copy_all_vars
true
/goods/detail/123123/view: hello
结论 04 :
share_all_vars 可能会污染全局变量,不推荐使用。
二、ngx.location.capture_multi
和 ngx.location.capture 的用法相似,但可以同时并发多个请求。
查看栗子 0 5
res1, res2, res3
ngx.
location
capture_multi
/foo
, { args
a=3&b=4
} },
/bar
},
/baz
, { method
HTTP_POST
, body
hello
--注意:这里省略了(),相当于({{}})
if
res1.
status
==
HTTP_OK
then
...
end
res2.
body
BLAH
local
reqs
{}
table.insert
(reqs, {
/mysql
/postgres
/redis
/memcached
-- issue all the requests at once and wait until they all return
resps
{ ngx.
(reqs) }
-- loop over the responses table
for
i, resp
in
ipairs
(resps)
do
-- process the response table "resp"
capture
function
uri
args
return
({ {uri, args} })
本条目发布于
2017年11月27日
。属于
分类,被贴了
lua
openresty
标签。
作者是
admin
entry-meta -->
文章导航
上一篇:
下一篇:
openResty中正则表达式的使用
》上有1条评论
Pingback引用通告:
openResty中ngx_lua模块提供的API | 精彩每一天
发表评论
取消回复
电子邮件地址不会被公开。
必填项已用
标注
姓名
电子邮件
站点
评论
您可以使用这些
HTML
标签和属性:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>
搜索:
angularJs
Bind
Codis
Es
ETL
Js
kafka
liunx
LVS
Mysql
vagrant
Vsftp
Yaf
Yum
Zookeeper
规划师
近期文章
一些图片
Openai的模型有哪些?
OpenAi官方提供的模型有哪些?
了解AI相关的概念一篇就够了
golang的命令行操作
计算机组成与设计-指令:计算机语言
计算机组成与设计:硬件_软件接口中文答案(第一章)
计算机组成与设计-计算机概要与技术
Prometheus中文文档
操作系统中的一些概念
动态规划
优秀程序设计的Kiss原则
理解二叉树的四种遍历-前序、中序、后序、层序
GO中参数传递的理解
GO中值交换的原理
递归算法满足的三个条件
链表操作练习题
数据结构与算法-数组 & 链表
认识时间复杂度与空间复杂度
锁机制及CAS实现原理
常见开源OLAP技术架构对比
ETL与大数据是什么关系?
设计模式
Workerman-高性能socket服务框架
Kubernetes文档
一文带你读懂CNCF Landscape
一张图搞懂head -n和tail -n
C语言学习笔记 – 编程基础
C语言学习笔记(一)
Yaf可选的配置项
Yaf运行时配置
PHP配置指令作用域说明
Yaf的安装
常见数据结构与算法整理总结(下)
常见数据结构与算法整理总结(上)
Nginx、LVS、HAProxy负载均衡软件的优缺点详解
TCP和UDP的区别[经典]
保证分布式系统数据一致性的6种方案
系统架构设计理论与原则
如何选择并落地架构方案的?
float与double的范围和精度
C代码到可执行文件的过程
使用C语言的7个步骤
openResty中ngx.shared.DICT的用法
openResty中cosocket的控制
openResty中获取请求 body
openResty中ngx_lua模块提供的常量
openResty中ngx_lua模块提供的指令
openResty学习中的知识点(一)
openResty的安装配置详解
Beanstalkd中文协议
查看linux中的TCP连接
BeansTalkd的命令
BeansTalkd的使用与安装
Redis中的Lua脚本
[转]理解OAuth 2.0
PostgreSQL中的系统环境变量
PostgreSQL的pg_hba.conf 客户端认证
微信小程序的app.json配置
MySQL 5.7 的新特性
MySQL的特性
MySQL的安装与配置
MariaDB的安装与配置
PostgreSQL与Mysql的不同之处
PostgreSQL的安装与配置
Go中的net/url包学习笔记
Go中net包中的方法
如何优雅地关闭Go channel
Goroutine Channel Select 的用法和理解
Goroutine和channel的详细理解(三)
Goroutine和channel的详细理解(二)
Goroutine和channel的详细理解(一)
Go新建文件权限与设置不符
Go中的os包之目录和文件(file)的操作
GO中new 和 make的区别
GO中断言interface类型的方法
Docker资源管理探秘-Cgroups机制
C语言中内存堆和栈的区别
Docker的内核知识之Namespace资源隔离
Docker的内核知识之cgroups资源限制
Docker 资源(cpu、memory)限制实践篇
Docker create / Docker run 的选项详解
Docker的实践笔记
Docker network的网络特性
Docker中的镜像构建-Dockerfile指令详解
Docker的命令之快捷指令
Docker的命令之数据卷管理 Volume
Docker的命令之系统管理 Docker system
Docker的命令之集群管理 swarm
Docker的命令之 Docker stacks
Docker的命令之集群服务管理 Service
Docker的命令之安全管理 Docker secret
Docker的命令之插件管理 Plugin
Docker的命令之集群节点管理 Swarm node
Docker的命令之网络管理 network
Docker的命令之镜像管理 Image
Docker的命令之容器管理 Container
文章归档
2023年十一月
2023年五月
2023年四月
2022年十月
2021年十二月
2021年九月
2021年五月
2021年四月
2021年三月
2020年十一月
2020年八月
2020年六月
2019年一月
2018年九月
2018年二月
2018年一月
2017年十二月
2017年十一月
2017年十月
2017年九月
2017年八月
2017年七月
2017年六月
2017年五月
2017年四月
2017年三月
2017年二月
2017年一月
2016年十二月
2016年十一月
2016年十月
2016年九月
2016年八月
2016年六月
2016年五月
2016年四月
2016年三月
2016年二月
2016年一月
2015年十二月
2015年九月
2015年八月
2015年七月
2015年三月
备案号:
冀ICP备14002216号-1