配置openresty使用lua并发请求API_weixin_34100227的博客-CSDN博客


本站和网页 https://blog.csdn.net/weixin_34100227/article/details/89132337 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

配置openresty使用lua并发请求API_weixin_34100227的博客-CSDN博客
配置openresty使用lua并发请求API
weixin_34100227
于 2016-12-29 19:58:57 发布
550
收藏
文章标签:
lua
php
json
原文链接:https://segmentfault.com/a/1190000007957976
版权
背景
现在搞的系统前后端分离,采用 restful 风格设计 API.随着业务发展,出现了一个页面的数据需要请求多个接口,才能完整展示数据.导致页面加载耗时很长.因此决定采用openresty 来并发请求客户端发送来的接口地址,再一次性返回多个接口的数据给前端.这样前端只需要请求服务端一次.还可以任意组装接口.使用的框架是 laravel. 每一个接口地址都要指定请求方式才可以访问.
Lua语法
lua特殊点1.默认变量,函数都是全局的.慎用.要用 local 修饰符.2.字符串,数组下标是从1开始
一.数据类型
nil 空一个变量未被赋值就是 nil将 nil赋予给一个全局变量就等于删除它
boolean 布尔lua 中 nil 和 false 为假.其他为真.0和空字符串也是真
number 数字用于表示实数. math.floor向下取整. math.ceil 向上取整
string 字符串lua 中字符串不能更改.也不能通过下标访问某个字符.在 lua 中.两个完全一样的 lua 字符串在虚拟机中只会存储一份.每一个字符串在创建时都会插入到 lua 虚拟机内部的一个全局的哈希表中.
table 表table 类型实现了一种抽象的关联数组.
local corp = {
name = “kang”,
age = 20
function 函数在 lua 中.函数也是一种数据类型.函数可以存储在变量中.通过参数传递给其他函数.汉可以作为函数的返回值.
local function foo()
local x=10;
local y=20;
return x+y;
end;
local a=foo;
a();
二.表达式
算术运算符加+ 减- 乘* 除/ 指数^ 取余%
关系运算符小于< 大于> 小于等于<= 大于等于>= 等于== 不等于~=
逻辑运算符与 and或 or非 not
字符连接使用操作符 “..” (两个点).如果其任意一个是数字的话.将会把这个数字转换为字符串.
也可以用 string 库的函数 string.format 连接字符串.
string.format(“%s-%s”,”hello”,”word”);
hello-word
推荐使用 table.concat()来进行字符串拼接.因为 lua 中字符串是只读的.连接操作会创建一个新的字符串.性能损耗大.
三.表达式
1.单个 if 分支
x=10
if x>0 then
print(x);
end;
2.两个分支 if-else
x=10
if x>0 then
print(0);
else
print(1)
end;
3.多个分支 if-elseif-else
score=10
if score==10 then
print(1)
elseif score==11 then
print(2)
else
print(3)
end;
4.whie 控制结构while 表达式==真 do
todo
end;
x=1
sum=0
while x<=5 do
sum = sum+x;
x = x+1;
end;
5.repeat 控制结构类似于 do-while 语句
repeat
todo
until 条件==假
6.for 数字型for var=begin,finish,step do
todo
end;step 默认为1
for i=1,5,1 do
print(i);
end;
泛型泛型 for 循环通过一个迭代器函数来遍历所有制.
local a= {“a”,”b”,”c”}
for i,v in ipairs(a) do
print(i,v)
end;
lua 的基础库提供了 ipairs. 这是一个用于遍历数组的迭代器函数.用于迭代文件中每行的(io.lines)、 迭代 table 元素的(pairs)、迭代数组元素的(ipairs)、迭代字符串中单词的(string.gmatch)
函数
函数的定义
function name (arc)
todo
end;
name = function (arc)
end;
没有 local 修饰的都是全局变量.因此函数声明局部函数也要用上 local
local function name (arc)
todo
end;
函数名还可以是 table 数量类型中某个字段.
function stu.getName()
todo
end;
函数的参数 lua 函数的参数大部分都是按值传递.
在调用函数的时候,若形参个数和实参个数不同时,Lua 会自动调整实参个数。调整规则:若实参个数大于形参个数,从左向右,多余的实参被忽略;若实参个数小于形参个数,从左向右,没有被实参初始化的形参会被初始化为 nil。
变长参数若形参为 … 则该函数可以接收不同长度的参数.访问参数的时候也要使用...
local function func( ... )
local tmp = {…}
for k,v in pairs(tmp) do
print(v)
end;
end;
函数的返回值 lua 允许函数返回多个值.
loca s,e = string.find(“hello word”,”llo");返回字符串的开始位置和结束位置的下标
返回多个值时.值之间用”,”隔开.
调整规则: 若返回值个数大于接收变量的个数,多余的返回值会被忽略掉; 若返回值个数小于参数个数,从左向右,没有被返回值初始化的变量会被初始化为 nil。
注意:当一个函数有一个以上返回值,且函数调用不是一个列表表达式的最后一个元素,那么函数调用只会产生一个返回值,也就是第一个返回值。
local function init() -- init 函数 返回两个值 1 和 "lua"
return 1, "lua"
end
local x, y, z = init(), 2 -- init 函数的位置不在最后,此时只返回 1
print(x, y, z) -->output 1 2 nil
local a, b, c = 2, init() -- init 函数的位置在最后,此时返回 1 和 "lua"
print(a, b, c) -->output 2 1 lua
模块从 lua5.1开始.增加了对模块和包的支持.一个模块的数据结构是用一个 lua 值(通常是一个 lua 表或者 lua 函数).可以使用 require()来加载和缓存模块.
定义个模块 my.lua
local foo={}
local function getname()
return "Lucy"
end
function foo.greeting()
print("hello " .. getname())
end
return foo
定义个 main.lua.调用 my.lua模块
local fp = require("my")
fp.greeting() -->output: hello Lucy
元表
setmetatable(table, metatable)此方法用于为一个表设置元表getmetatable(table)获取表的元表对象
local mytable = {}
local metatable = {}
setmetatable(mytable, metatable);
or
mytable = setmetatable({},{})
修改表的操作符行为通过重载”__add”元方法来计算集合的并集;
local table_1 = {10,20,30};
local table_2 = {40,50,60};
local metatable = {};
metatable.__add = function (self, another)
local sum = {};
for k,v in pairs(self) do
table.insert(sum,v);
end;
for k,v in pairs(another) do
table.insert(sum,v);
end
return sum;
end;
setmetatable(table_1, metatable);
table_3 = table_1+table_2;
for k,v in pairs(table_3) do
print(v)
end
除了加法可以被重载之外,Lua 提供的所有操作符都可以被重载:
元方法 含义"__add" + 操作"__sub" - 操作 其行为类似于 "add" 操作"__mul" * 操作 其行为类似于 "add" 操作"__div" / 操作 其行为类似于 "add" 操作"__mod" % 操作 其行为类似于 "add" 操作"__pow" ^ (幂)操作 其行为类似于 "add" 操作"__unm" 一元 - 操作"__concat" .. (字符串连接)操作"__len" # 操作"__eq" == 操作 函数 getcomphandler 定义了 Lua 怎样选择一个处理器来作比较操作 仅在两个对象类型相同且有对应操作相同的元方法时才起效"__lt" < 操作"__le" <= 操作除了操作符之外,如下元方法也可以被重载,下面会依次解释使用方法:
元方法 含义"__index" 取下标操作用于访问 table[key]"__newindex" 赋值给指定下标 table[key] = value"__tostring" 转换成字符串"__call" 当 Lua 调用一个值时调用"__mode" 用于弱表(week table)"__metatable" 用于保护metatable不被访问
组合设计
安装 openresty
推荐使用官网教程https://openresty.org/cn/inst...
配置 nginx 使用 lua
location /kang {
add_header content-type application/json;
content_by_lua_file lua/kang.lua;
lua代码
--加载 json 库
local json = require "cjson";
--获取请求方式
local request_method = ngx.var.request_method;
--判断请求方式
if request_method == "GET" then
ngx.say(json.encode({"only post"}));
return;
end;
--读取 post 参数.表单需要是 x-www-form-urlencoded
ngx.req.read_body();
local api_p = ngx.req.get_post_args();
--拼接子请求
local list = {};
for api,p in pairs(api_p) do
local tmp = {api,{args=p,method=ngx.HTTP_GET}};
table.insert(list, tmp);
end;
--发送子请求
local response = {ngx.location.capture_multi(list)};
--合并响应
local data = {};
for num,resp in pairs(response) do
resp = json.decode(resp["body"]);
data[resp["uri"]] = resp;
end;
--响应到客户端
ngx.say(json.encode(data));
坑0.请求分为父请求,子请求.父请求就是客户端请求 nginx 服务器.子请求就是 catpure_multi,capture 函数发起的请求.1.发出子请求时.要指定子请求的请求方式.不然默认使用父请求的请求方式2.nginx 的内置变量 $request_uri 只能获取到父请求.如果要获取到子请求.需要使用第三方库ngx_echo 提供的内建变量 $echo_request_method3.在 php 中获取不到子请求.需要通过 fastcgi_param 传到 php里
配置 location
location /api {
#记录下子请求的请求方式, uri
set $my_uri $uri;
set $my_method $echo_request_method;
root /var/www/html;
index index.html index.htm;
try_files $uri $uri/ /index.php?$query_string;
access_log /usr/local/openresty/nginx/logs/access.log main;
location ~ \.php {
root /var/www/html/laravel/public;
include fastcgi_params;
#fastcgi_pass unix:/home/wenba/php/var/run/php.sock;
fastcgi_pass 127.0.0.1:9000;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_index index.php;
fastcgi_param REQUEST_URI $my_uri;
fastcgi_param REQUEST_METHOD $my_method;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
请求
weixin_34100227
关注
关注
点赞
收藏
评论
配置openresty使用lua并发请求API
背景现在搞的系统前后端分离,采用 restful 风格设计 API.随着业务发展,出现了一个页面的数据需要请求多个接口,才能完整展示数据.导致页面加载耗时很长.因此决定采用openresty 来并发请求客户端发送来的接口地址,再一次性返回多个接口的数据给前端.这样前端只需要请求服务端一次.还可以任意组装接口.使用的框架是 laravel...
复制链接
扫一扫
Openresty(四)lua api简介
wzj_110的博客
03-09
357
说明: 主要是通过一些'例子'来说明'lua api'提供了'哪些功能'
一 参考资料
理解: openresty、lua、lua_api三者'关系'
(1)lua指令和lua_api
说明: 大约'40'多个指令、'120'多个api,'熟悉核心'即可,需要的时候知道'如何查询'即可
(2)openresty自带的api
说明: 我们平时'使用'的时候,'引用'的相对路径是'/usr/local/openresty/lualib/'
常用: 'cjson'、'ngx'、'mys..
参与评论
您还未登录,请先
登录
后发表或查看评论
k8s搭建链路监控:skywalking
全栈测试笔记
11-10
46
skywalking架构及简介
官网:https://github.com/apache/skywalking
简介
Java, .NET Core, NodeJS, PHP, and Python auto-instrument agents.
Go and C++ SDKs.
LUA agent especially for Nginx, OpenResty and Apache API...
lua发送带http post 带多个参数请求并解析后台响应json数据
weixin_44259356的博客
07-19
6004
lua发送带http post 带多个参数请求并解析后台响应json数据lua发送带http post 带多个参数请求并解析后台响应json数据lua发送http post带多个参数请求获取请求路径信息发送请求解析json安装cjson使用cjson解析json解析json
lua发送带http post 带多个参数请求并解析后台响应json数据
公司要求kong网关从后台读取用户权限数据,特此记...
nginx+lua获取get请求参数,PathVariable形式参数值
泥耳空间
02-28
3291
一、如果接口请求地址是 http://localhost/get/{id}
示例:
http://localhost/get/123
123是变量id的值
需要让nginx中的lua脚本获取到值的话,配置
nginx配置:
location /get {
set $id $1; #定义一个变量,变量名为 id,$1 为http://localhost/get/后面第一个参数
content_by_lua_file demo.lua; #使用lua脚本
demo.
【Lua进阶系列】实例lua调用capi
cooclc的博客
01-05
994
【Lua进阶系列】C++与lua的相互调用
大家好,我是Lampard~~
欢迎来到Lua进阶系列的博客
首先祝大家2021新年好~工作顺利节节高
前文再续,书接上一回。今天和大家实战一下lua调用c++的API
(一)前言
大家都知道,lua和c/c++之间是通过一个lua_Stack进行交互的,关于lua_Stack,网上对它的叫法有很多,有的说它是一个lua的堆栈,有的说它是lua...
Lua入门(四)相关API
John的博客
12-31
492
头文件lua.h定义了Lua提供的基础函数,包括创建Lua环境、调用Lua函数(如Lua_pcall)、读写Lua环境中的全局变量,以及注册供Lua调用的新函数等。lua.h中定义所有内容都有一个lua_前缀。
头文件lauxlib.h定义了辅助库提供的函数。它的所有定义都以luaL_开头(如luaL_loadbuffer)。辅助库是一个使用lua.h中API编写出的一个较高抽象层。Lua的所有标准库编写都用到了辅助库。基础API的设计保证原子性和正交性,而辅助库则侧重于解决具体的任务。
luaL_ne.
lua-发送http请求
热门推荐
anbolihua的博客
08-09
2万+
概述:
lua 你可以理解为又一门比较轻便的语言,他对nginx做了很好的支撑。
本文写的目的主要是做网站的时候,有部分简单逻辑交给了lua,需要发送请求到别的机器,于是就有了本篇lua之HTTP的整理。
实现方式有两种,如下:
方式一:socket.http
github地址:https://github.com/diegonehab/luasocket
包使用:直接解...
lua发送http get请求
Game Developer
03-30
1万+
环境: Win7_x64 + lua5.1
环境搭建: 在windows上安装LuaForWindows_v5.1.4-35
打开SciTE,新建lua文件,输入源码:
local http = require("socket.http")
local ltn12 = require("ltn12")
function http.get(u)
local t = {}
lo
openresty +lua 知识点
qq_36120342的博客
12-27
1401
openresty +lua 知识点
1、动态设置头信息
nginx.conf
location /api {
access_by_lua_file lua/setApiHeader.lua;
proxy_pass http://gateway;
setApiHeader.lua
local cjson=require "cjson"
local item_cache=ngx.shared.item_cache
local headers=ngx.req
openresty lua-resty-http api请求
最新发布
weixin_43931625的博客
07-24
594
openresty lua-resty-http api请求
OpenResty下通过lua脚本提供http接口
一一空的专栏
05-21
505
Openresty下通过lua脚本结合nginx配置提供http接口
Centos7安装OpenResty以及整合Lua简单的使用
weixin_39555954的博客
04-22
2640
目录
一、什么是OpenResty
二、OpenResty安装
传统方式安装
Docker方式安装
三、结合lua简单使用
1、输出helloword
2、限流
一、什么是OpenResty
OpenResty是一个基于Nginx与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。OpenResty的目标是让你的Web服务直接跑在Nginx服务内
Envoy打印请求和响应Body
z2011415107的博客
11-24
806
1、添加Lua Filter实现对请求和响应的拦截
参考:https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_filters/lua_filter#dynamic-metadata-object-api
利用Lua脚本提取请求和响应Body信息,并设置到dynamicMetadata中。Lua脚本内容如下:
function envoy_on_request(request_handle)
local req.
OpenResty 编译安装 与 lua 脚本
cn_yaojin
01-07
1826
编译openresty:
./configure --prefix=/usr/local/openresty --with-luajit --with-http_ssl_module --with-stream --with-stream=dynamic --with-stream_ssl_module --with-stream_realip_module --with-mail --wit...
第一章安装OpenResty(Nginx+Lua)开发环境
jinnianshilongnian的专栏
02-17
1016
首先我们选择使用OpenResty,其是由Nginx核心加很多第三方模块组成,其最大的亮点是默认集成了Lua开发环境,使得Nginx可以作为一个Web Server使用。借助于Nginx的事件驱动模型和非阻塞IO,可以实现高性能的Web应用程序。而且OpenResty提供了大量组件如Mysql、Redis、Memcached等等,使在Nginx上开发Web应用更方便更简单。目前在京东如实时价格...
Openresty最佳案例 | 第4篇:OpenResty常见的api
weixin_30644369的博客
11-23
392
转载请标明出处:
http://blog.csdn.net/forezp/article/details/78616660
本文出自方志朋的博客
获取请求参数
vim /usr/example/example.conf
location /lua_var {
default_type 'text/plain';
...
OpenResty学习——第二章 OpenResty(Nginx+Lua)开发入门のNginx Lua API
PeterOK的博客
07-03
210
本文转自https://blog.csdn.net/jinnianshilongnian/article/details/84702680,好文要顶,感谢博主分享!
Nginx入门
本文目的是学习Nginx+Lua开发,对于Nginx基本知识可以参考如下文章:
nginx启动、关闭、重启
http://www.cnblogs.com/derekchen/archive/2011/02...
微服务API网关框架之openresty如何使用lua
G_SANGSK的博客
06-08
1377
openresty中引入lua
1、openresty中的nginx引入lua的方式
xxx_by_lua 字符串编码方式
xxx_by_lua_block 代码块方式
xxx_by_lua_file 引入一个lua脚本文件
第一种方式:content_by_lua
location /lua {
default_type 'text/html';
#lua_code_cache off;
...
Openresty ngx_lua_api 方法和常量
weixin_39584758的博客
01-08
1847
-------------------------------------- 常用方法和常量 ------------------------------------------
-------------------------------------------------------------------------------------------------------
ngx....
lua + openresty web API 框架
lyover的博客
02-18
3767
这是一个非常易用简单的 web api 框架,采取了一些较好的 php 框架的设计主要目录结构分为 lib(公共方法),model(数据库相关),controller(由 nginx location 指向的 lua文件也就是控制器)以下是一些基本用法:local cjson = require('cjson')
local conf = require('config.app')
local Mo
“相关推荐”对你有帮助么?
非常没帮助
没帮助
一般
有帮助
非常有帮助
提交
©️2022 CSDN
皮肤主题:大白
设计师:CSDN官方博客
返回首页
weixin_34100227
CSDN认证博客专家
CSDN认证企业博客
码龄7年
暂无认证
139
原创
3万+
周排名
32万+
总排名
96万+
访问
等级
5913
积分
4147
粉丝
172
获赞
18
评论
919
收藏
私信
关注
热门文章
影响未来十年的10项互联网新技术
14694
python打印图形大全(详解)
11511
数据相关性分析方法
9026
渗透测试以及安全面试的经验之谈-技术篇
8740
面试题:寻找一个字符串中出现次数最多的字符以及出现的次数
7931
最新评论
centos6.9安装xampp后报错:egrep: error while loading shared libraries: libc.so.6: cannot open shared objec...
qq_46136495:
谢谢大佬!!!问题已经解决
十三、oracle 数据字典和动态性能视图
睿思达DBA_WGX:
好文章,收藏了。
C#--静态成员的生命周期
皮卡冲撞:
膜拜技术大佬,来我博客指点江山吧
24个终极数据科学项目(可免费获取资源)
Tisfy:
总结得十分精辟,就像那:先天下之忧而忧,后天下之乐而乐
django 使用手机号码/邮箱email代替用户名username登陆
Tisfy:
楼主,你写得实在是太好了
您愿意向朋友推荐“博客详情页”吗?
强烈不推荐
不推荐
一般般
推荐
强烈推荐
提交
最新文章
matlab练习程序(RGB2CMY、CMY2RGB)
推荐六本前端开发必看的书籍
巧用MsgGetText
2019年374篇
2018年668篇
2017年927篇
2016年547篇
2015年412篇
2014年308篇
2013年302篇
2012年281篇
2011年189篇
2010年137篇
2009年115篇
2008年103篇
2007年77篇
2006年37篇
2005年12篇
2004年9篇
目录
目录
最新文章
matlab练习程序(RGB2CMY、CMY2RGB)
推荐六本前端开发必看的书籍
巧用MsgGetText
2019年374篇
2018年668篇
2017年927篇
2016年547篇
2015年412篇
2014年308篇
2013年302篇
2012年281篇
2011年189篇
2010年137篇
2009年115篇
2008年103篇
2007年77篇
2006年37篇
2005年12篇
2004年9篇
目录
评论
被折叠的 条评论
为什么被折叠?
到【灌水乐园】发言
查看更多评论
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额
抵扣说明:
1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。 2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。
余额充值