5.OpenResty系列之深入理解(一)

本文基于Centos8进行实践,请读者自行安装OpenResty。

1. 内部调用

进入默认安装路径

cd /usr/local/openresty/nginx/conf
vim nginx.conf
        location /sum {# 只允许内部调用internal;content_by_lua_block {local args = ngx.req.get_uri_args()ngx.print(tonumber(args.a) + tonumber(args.b))}}
2. 并行请求
        location /multi {content_by_lua_block {local start_time = ngx.now()local res1, res2 = ngx.location.capture_multi( {{"/sum", {args={a=3, b=8}}},{"/sum", {args={a=3, b=8}}}})ngx.say("status:", res1.status, " response:", res1.body)ngx.say("status:", res2.status, " response:", res2.body)ngx.say("time used:", ngx.now() - start_time)}    }

3. 流水线方式跳转
        location /exec {content_by_lua_block {ngx.exec("/sum?a=6&b=8")}}

ngx.redirect为重定向,比如访问baidu.com会重定向https://baidu.com,
ngx.exec方法与ngx.redirect是完全不同的,前者纯粹内部跳转并且没有引入任何额外 HTTP信号

4. 获取GET与POST参数
        location /print_param {content_by_lua_block {local arg = ngx.req.get_uri_args()for k,v in pairs(arg) dongx.say("[GET ] key:", k, " v:", v)endngx.req.read_body() local arg = ngx.req.get_post_args()for k,v in pairs(arg) dongx.say("[POST] key:", k, " v:", v)end}   }
5. 在内部方法中传参
location /test {content_by_lua_block {local res = ngx.location.capture('/print_param',{method = ngx.HTTP_POST,args = ngx.encode_args({a = 1, b = '2&'}),body = ngx.encode_args({c = 3, d = '4&'})})ngx.say(res.body)}}

6. 获取请求body
        # 默认读取 bodylua_need_request_body on;location /get_body_data {content_by_lua_block {local data = ngx.req.get_body_data()ngx.say("hello ", data)}}

7. 输出响应体

ngx.say 与 ngx.print 均为异步输出

如何优雅处理响应体过大的输出?

如果响应体比较小,这时候相对就比较随意,但是如果响应体过大,是不能直接调用 API 完成响应体输出的。响应体过大,分两种情况:

① 输出内容本身体积很大,例如大文件下载
② 输出内容本身是由各种碎片拼凑的,碎片数量庞大,例如应答数据是某地区所有地址数据

第①个情况,要利用HTTP 1.1特性CHUNKED编码来完成,利用 CHUNKED 格式,把一个大的响应体拆分成多个小的应答体,分批、有节制的响应给请求方

# 开启chunked编码
chunked_transfer_encoding on;
location /download_large_file {content_by_lua_block {-- ngx.var.limit_rate = 1024*1024local file, err = io.open(ngx.config.prefix() .. "data.db","r")if not file thenngx.log(ngx.ERR, "open file error:", err)ngx.exit(ngx.HTTP_SERVICE_UNAVAILABLE)endlocal datawhile true dodata = file:read(1024*1024)if nil == data thenbreakendngx.print(data)ngx.flush(true)endfile:close()}
}

我们在/usr/local/openresty/nginx目录下准备data.db文件,按块读取本地文件内容(每次1MB),并以流式方式进行响应。

第②个情况,其实就是要利用 ngx.print 的特性了,它的输入参数可以是单个或多个字符串参数,也可以是 table 对象

local table = {"hello, ",{"world: ", true, " or ", false,{": ", nil}}}ngx.print(table)

将输出:

hello, world: true or false: nil

也就是说当有非常多碎片数据时,没有必要一定连接成字符串后再进行输出。完全可以直接存放在 table 中,用数组的方式把这些碎片数据统一起来,直接调用 ngx.print(table) 即可。这种方式效率更高,并且更容易被优化

欢迎关注公众号算法小生

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/295824.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

显卡之争!英伟达和AMD下场互掐!GPU霸主地位是否能保?

大家好,我是二狗。 英伟达和AMD这两家芯片巨头掐起来啦! 事情的起因是,两周前AMD董事会主席兼CEO苏姿丰在一场活动中发布了用于生成式AI和数据中心的新一代Intinct MI300X GPU芯片加速卡。 单单发布显卡没啥问题,但是AMD声称MI300…

1857_什么是AEC-Q100认证

Grey 全部学习内容汇总: GitHub - GreyZhang/g_hardware_basic: You should learn some hardware design knowledge in case hardware engineer would ask you to prove your software is right when their hardware design is wrong! 1857_什么是AEC-Q100认证 经…

生成式AI大爆发,2024年人工智能3大发展趋势预测

人工智能(AI)多年来一直是技术界讨论的热门话题,但在2023年,它完全抓住了大众的注意力和想象力。ChatGPT和类似的技术让外行人也能接触到人工智能,生成式AI以前所未有的速度从小众走向主流。在大家都普遍认为AI存在着能力局限性的情况下&…

天文与计算机:技术的星辰大海

天文与计算机:技术的星辰大海 一、引言 在人类的历史长河中,天文学与计算机技术这两个领域似乎相隔甚远,然而在科技的推动下,它们却逐渐走到了一起,为人类对宇宙的探索开辟了新的道路。天文观测的复杂度与数据量随着…

推荐算法架构7:特征工程(吊打面试官,史上最全!)

系列文章,请多关注 推荐算法架构1:召回 推荐算法架构2:粗排 推荐算法架构3:精排 推荐算法架构4:重排 推荐算法架构5:全链路专项优化 推荐算法架构6:数据样本 推荐算法架构7:特…

中级软件设计师-note-2

一个逆向思维的例子是 “当遇到一个问题时,通常人们会想办法解决这个问题。但逆向思维是指反过来考虑,即想办法制造更多的问题。 举个例子,假设有一个团队正在开发一款新的智能手机。传统的思维方式可能是专注于如何增加手机的功能&#xf…

Log4net 教程

一、Log4net 教程 在CodeProject上找到一篇关于Log4net的教程:log4net Tutorial,这篇博客的作者是:Tim Corey ,对应源代码地址为: https://github.com/TimCorey/Log4netTutorial,视频地址为:Ap…

安装Kubernetes1.23、kubesphere3.4、若依项目自动打包部署到K8S记录

1.安装kubernetes1.23详细教程 kubernetes(k8s)集群超级详细超全安装部署手册 - 知乎 2.安装rancher动态存储 kubectl apply -f https://raw.githubusercontent.com/rancher/local-path-provisioner/master/deploy/local-path-storage.yaml3.安装kubesphere3.4 准备工作 您…

matlab时间转换

采集的GNSS数据是10hz的。 data(选取其中一部分)如下: (1)char类型 formatOut yyyy-mm-dd HH:MM:SS; str datestr(data,formatOut); str如下: (2)double类型 DateVector dat…

小白入门之安装NodeJS

重生之我在大四学JAVA 第五章 安装NodeJS 如果你在购买我闲鱼的程序,请尽量使用node14版本 修改安装路径 接着傻瓜式NEXT 测试是否安装成功 如果上面没提示版本号,就按照前两章配置环境变量步骤配置下环境变量 设置镜像地址 npm config set re…

pip 常用指令 pip cache 命令用法介绍

📑pip 常用命令归类整理 pip cache 是一个用于管理pip缓存的命令。pip是Python的包管理器,用于安装和管理Python包。当你使用pip安装一个包时,pip会首先在其缓存中查找该包。如果在缓存中找到,pip将从缓存中安装该包,…

【Filament】纹理贴图

1 前言 本文主要介绍使用 Filament 实现纹理贴图,读者如果对 Filament 不太熟悉,请回顾以下内容。 Filament环境搭建绘制三角形绘制矩形绘制圆形绘制立方体 Filament 纹理坐标的 x、y 轴正方向分别朝右和朝上,其 y 轴正方向朝向与 OpenGL ES…