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.mzph.cn/news/241222.shtml

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

相关文章

java进阶学习笔记

学习java深度学习,提升编程思维,适合掌握基础知识的工作者学习 1.反射和代理1.1 概念介绍1.2应用场景1.3 反射-reflect1.3.1 获得类-Class1.3.2 获得类的字段-Field1.3.3 动态访问和修改对象实例的字段1.3.4 获得类方法-Method1.3.5 调用方法.invoke1.3.…

评论回复功能数据库设计

1. 评论的场景 类似csdn博客评论 2. 建表sql CREATE TABLE comment (id varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT id,parent_id varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT 父级评论id(…

【Kafka每日一问】kafka三种压缩方式差别?

Kafka 提供了三种压缩算法,分别是GZIP、Snappy 和 LZ4。 这三种压缩算法的差异主要在以下方面: 压缩比:GZIP 压缩比最高,DEFLATE 算法,但压缩和解压缩速度相对较慢;Snappy 压缩比次之,但压缩和…

Kubernetes pod ip 暴露

1. k8s pod 和 service 网络暴露 借助 iptables 的路由转发功能,打通k8s集群内的pod和service网络,与外部网络联通 # 查看集群的 pod 网段和 service 网段 kubectl -n kube-system describe cm kubeadm-config networking:dnsDomain: cluster.localpod…

数据结构和算法笔记3:双指针法(快慢指针)

双指针法(快慢指针法)在数组、字符串和链表的操作中是非常常见的,这里结合力扣上的题进行可一下梳理,主要的思路是我们要明确快指针指的是什么,慢指针指的是什么。 1. 移除元素类问题 27. 移除元素 要我们移除目标元…

Vue2和Vue3组件间通信方式汇总(2)------$emit

组件间通信方式是前端必不可少的知识点,前端开发经常会遇到组件间通信的情况,而且也是前端开发面试常问的知识点之一。接下来开始组件间通信方式第二弹------$emit,并讲讲分别在Vue2、Vue3中的表现。 Vue2Vue3组件间通信方式汇总(1&#xff0…

《LeetCode力扣练习》代码随想录——双指针法(三数之和---Java)

《LeetCode力扣练习》代码随想录——双指针法&#xff08;三数之和—Java&#xff09; 刷题思路来源于 代码随想录 15. 三数之和 双指针 class Solution {public List<List<Integer>> threeSum(int[] nums) {List<List<Integer>> resultnew ArrayList&…

Debezium日常分享系列之:Debezium 2.5.0.Final发布

Debezium日常分享系列之&#xff1a;Debezium 2.5.0.Final发布 一、重大改变1.MySQL2.MongoDB3.JDBC4.Core 二、改进和变化1.Redis 架构历史重试现在受到限制2.初始快照的附加通知3.重新选择列4.增量快照水印的 INSERT/DELETE 语义5.MongoDB无缝大文档处理6.Mysql 8.2 support7…

1.反射,泛型

1.2.1 反射机制 Java的反射机制是指在程序的运行状态中&#xff0c;可以构造任意一个类的对象&#xff0c;可以了解任意一个对象所属的类&#xff0c;可以了解任意一个类的成员变量和方法&#xff0c;可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象…

JavaEE进阶学习:Spring MVC 程序开发

1.什么是 Spring MVC Spring Web MVC 是基于Servlet API 构建的原始 Web 框架&#xff0c;从一开始就包含在Spring 框架中。它的正式名称 “Spring Web MVC” 来自其源模块的名称(Spring-webmvc)&#xff0c;但它通常被称为“Spring MVC”。 从上述定义我们可以得出两个关键信…

如何改善与 Next Paint (INP) 的交互

但谷歌也会关注访问者到达后你的网站体验有多好。 在过去的几年里&#xff0c;谷歌已经彻底改变了哪些页面体验信号被收集并用作排名因素。 在引入核心网络指标后&#xff0c;谷歌逐渐调整了它们的衡量方式&#xff0c;以便更好地反映真实的用户体验。 然而&#xff0c;随着…

深入了解Pandas的数据类型

大家好&#xff0c;Pandas是一个功能强大的数据处理和分析库&#xff0c;它提供了丰富的数据类型&#xff0c;使得数据操作更加灵活和高效。本文我们将深入了解Pandas的数据类型&#xff0c;包括Series和DataFrame。 1.Series Series是Pandas中最基本的数据类型&#xff0c;它…

Unity中获取时间戳、日期、时间、毫秒、秒以相互转换、自定义格式时间

Unity中获取时间戳、日期、时间、毫秒、秒以相互转换、自定义格式时间 介绍时间戳是什么什么时候用时间戳 获取时间获取当前时间获取时间戳日期转时间戳时间戳转日期将时间戳转换为多久之前星期自定义格式时间 总结 介绍 这里附带一个时间戳和时间转换的网址 时间戳是什么 时…

【Spring实战】01 配置单数据源

文章目录 1. 定义2. 准备3. 打印连接信息4. 实战1&#xff09;创建表2&#xff09;添加数据3&#xff09;查询数据3&#xff09;执行 5. 详细代码总结 在我们常见的应用程序中&#xff0c;与数据库的交互是不可避免的一部分。Spring 提供了简单而强大的数据访问抽象&#xff0c…

九州金榜|家庭教育幼小衔接家长如何做?

孩子从幼儿园升入小学&#xff0c;很多家长会非常忧虑&#xff0c;进入小学便是孩子学校生涯正式开始&#xff0c;这个阶段作为家长会非常焦虑&#xff0c;会考虑孩子能不能适应小学生活&#xff1f;学习跟不跟得上&#xff0c;一般这个时候&#xff0c;大部分家长就会考虑给孩…

数值分析期末复习

第一章 科学计算 误差 解题步骤 先求绝对误差: ∣ x − x ∗ ∣ |x - x^*| ∣x−x∗∣求相对误差限: ∣ x − x ∗ ∣ x ∗ \frac{|x\,\,-\,\,x^*|}{x^*} x∗∣x−x∗∣​求有效数字 ∣ x − x ∗ ∣ 需要小于它自身的半个单位 |x-x^*|\text{需要小于它自身的半个单位} ∣…

Python入门学习篇(六)——for循环while循环

1 for循环 1.1 常规for循环 1.1.1 语法结构 for 变量名 in 可迭代对象:# 遍历对象时执行的代码 else:# 当for循环全部正常运行完(没有报错和执行break)后执行的代码1.1.2 示例代码 print("----->学生检查系统<------") student_lists["张三",&qu…

drools高级语法

前面章节我们已经知道了一套完整的规则文件内容构成如下&#xff1a; 关键字 描述 package 包名&#xff0c;只限于逻辑上的管理&#xff0c;同一个包名下的查询或者函数可以直接调用 import 用于导入类或者静态方法 global 全局变量 function 自定义函数 query 查询…

Win32 Socket 使用

库说明 Win32 进行网络编程需要使用到 ws2_32.lib 库&#xff0c;它是 Windows Sockets 2 (Winsock2) 的库文件&#xff0c;其主要头文件为winsock2.h。如果使用 Windows.h 头文件则默认包含 winsock.h&#xff0c;他会和 winsock2.h 冲突。可以通过在包含 Windows.h 之前定义…

数据压缩(哈夫曼编码)

【问题描述】在数据压缩问题中&#xff0c;需要将数据文件转换成由二进制字符0、1组成的二进制串&#xff0c;称之为编码&#xff0c;已知待压缩的数据中包含若干字母&#xff08;A-Z&#xff09;&#xff0c;为获得更好的空间效率&#xff0c;请设计有效的用于数据压缩的二进制…