http的请求上下文
1.引入:
上下文是指HTTP框架为每个HTTP请求所准备的结构体。 HTTP框架定义的这个上下文是针对于HTTP请求的, 而且一个HTTP请求对应于每一个HTTP模块都可以有一个独立的上下文结构体(并不是一个请求的上下文由所有HTTP模块共用) 。
2.概述:
1.简单地讲, 就是在一个请求的处理过程中, 用类似struct这样的结构体把一些关键的信息都保存下来, 这个结构体可以称为请求的上下文。 每个HTTP模块都可以有自己的上下文结构体, 一般都是在刚开始处理请求时在内存池上分配它, 之后当经由epoll、HTTP框架再次调用到HTTP模块的处理方法时, 这个HTTP模块可以由请求的上下文结构体中获取信息。 请求结束时就会销毁该请求的内存池, 自然也就销毁了上下文结构体。 以上就是HTTP请求上下文的使用场景, 由于1个上下文结构体是仅对1个请求1个模块而言的, 所以它是低耦合的。 如果这个模块不需要使用上下文, 也可以完全不理会HTTP上下文这个概念
2.为什么要有上下文:(epoll原理)epoll详解_致守的博客-CSDN博客
因为Nginx是个强大的全异步处理的Web服务器, 意味着1个请求并不会在epoll的1次调度中处理完成, 甚至可能成千上万次的调度各个HTTP模块后才能完成请求的处理
解疑:
1.Apache服务器:
以Apache服务器为例, Apache就像某些高档餐厅, 每位客人(HTTP请求) 都有1位服务员(一个Apache进程) 全程服务, 每位服务员只有从头至尾服务完这位客人后, 才能去为下一个客人提供服务。 因此餐厅的并发处理数量受制于服务员的数量, 但服务员的数量也不是越多越好, 因为餐厅的固定设施(CPU) 是有限的, 它的管理成本(Linux内核的进程切换成本) 也会随着服务员数量的增加而提高, 最终影响服务质量
2.Nginx:
1位服务员同时处理所有客人的需求。 当1位客人进入餐厅后, 服务员首先给它安排好桌子并把菜单给客人后就离开了, 继续服务于其他客人。 当这位客人决定点哪些菜后, 就试图去叫服务员过
来处理点菜需求, 当然, 服务员可能正在忙于其他客人, 但只要一有空闲就会过来拿菜单并
交给厨房, 再去服务于其他客人。 直到厨房通知这位客人的菜已烹饪完毕, 服务员再取来菜
主动地传递给客人, 请他用餐, 之后服务员又去寻找是否有其他客人在等待服务。
当1位客人进入Nginx“餐厅”时, 首先是由客人来“激活”Nginx“服务员”的。Nginx“服务员”再次来处理这位客人的请求时, 有可能是因为这位客人点完菜后大声地叫Nginx“服务员”, 等候她来服务,也有可能是因为厨房做好菜后厨师“激活”了这位客人的服务, 也就是说“激活”Nginx“服务员”的对象是不固定的
餐厅的流程是先点菜, 再上菜, 最后收账单以及撤碗盘, 但客人是不想了解这个流程的, 所以Nginx“服务员”需要为每位客人建立上下文结构体来表示客人进行到哪个步骤, 即他点了哪些菜、 目前已经上了哪些菜, 这些信息都需要独立的保存。 “服务员”不会去记住所有客人的“上下文信息”, 因为要同时服务的客人可能很多, 只有在服务到某位客人时才会去查对应的“上下文信息
餐厅的流程是先点菜, 再上菜, 最后
收账单以及撤碗盘, 但客人是不想了解这个流程的, 所以Nginx“服务员”需要为每位客人建
立上下文结构体来表示客人进行到哪个步骤, 即他点了哪些菜、 目前已经上了哪些菜, 这些
信息都需要独立的保存。 “服务员”不会去记住所有客人的“上下文信息”, 因为要同时服务的
客人可能很多, 只有在服务到某位客人时才会去查对应的“上下文信息
上面说的Nginx“服务员”就像Nginx worker进程, 客人就是一个个请求, 一个Nginx进程同时可以处理百万级别的并发HTTP请求。 厨房这些设施可能是网卡、 硬盘等硬件。 因此, 如果我们开发的HTTP模块会多次反复处理同1个请求, 那么必须定义上下文结构体来保存处理过程的中间状态, 因为谁也不知道下一次是由网卡还是硬盘等服务来激活Nginx进程继续处理这个请求。 Nginx框架不会维护这个上下文, 只能由这个请求自己保存着上下文结构体。
再把这个例子对应到HTTP框架中。 点菜可能是一件非常复杂的事, 因为可能涉及凉菜、 热菜、 汤、 甜品等。 假如HTTP模块A负责凉菜、 HTTP模块B负责热菜、 HTTP模块C负
责汤。 当一位新客人到来后, 他招呼着服务员(worker进程) 和HTTP框架处理他的点菜需求时(假设他想点2个凉菜、 5个热菜、 1个汤) , HTTP模块A刚处理了1个凉菜, 又有其他客
人将服务员叫走了, 那么, 这个客人处必须有一张纸记录着关于凉菜刚点了一个, 另一张纸
记录着热菜一个没点, 由于HTTP模块C知道, 当前的餐厅汤已经卖完, 业务实在是太简单了
所以不需要再有一张纸记录着汤有没有点。 这两张纸只从属于这个客人, 对于其他客人没有意义, 这就是上面所说的, 上下文只是对于一个请求而言。 同时, 每个HTTP模块都可以拥有记录客人(请求) 状态的纸, 这张纸就其实就是上下文结构体。 当这个客人叫来服务员时, 各个HTTP模块可以查看客人身前的两张纸, 了解点了哪些菜, 这才可以继续处理下去
3.使用:
ngx_http_get_module_ctx和ngx_http_set_ctx这两个宏可以完成HTTP上下文的设置和使用。
先看看这两个宏的定义:
#define ngx_http_get_module_ctx(r, module) (r)->ctx[module.ctx_index]
#define ngx_http_set_ctx(r, c, module) r->ctx[module.ctx_index] = c
解析:
1.ngx_http_get_module_ctx接受两个参数, 其中第1个参数是ngx_http_request_t指针, 第2个
参数则是当前的HTTP模块对象
ngx_http_get_module_ctx返回值就是某个HTTP模块的上下文结构体指针, 如果这个HTTP模块没有设置过上下文, 那么将会返回NULL空指针。 因此, 在任何一个HTTP模块中, 都可以使用ngx_http_get_module_ctx获取所有HTTP模块为该请求创建的上下文结构体。
2.ngx_http_set_etx接受3个参数,其中第1个参数是ngx_http_request_t指针,第2个参数是准备设置的上下文结构体的指针,第3个参数则是HTTP模块对象。
实践:
//创建上下文结构体
typedef struct {
ngx_uint_t my_step;
} ngx_http_mytest_ctx_t
当请求第1次进入mytest模块处理时, 创建ngx_http_mytest_ctx_t结构体, 并设置到这个请
求的上下文中:
static ngx_int_t ngx_http_mytest_handler(ngx_http_request_t*r)
{// 首先调用ngx_http_get_module_ctx宏来获取上下文结构体ngx_http_mytest_ctx_t* myctx = ngx_http_get_module_ctx(r,ngx_http_mytest_module);// 如果之前没有设置过上下文, 那么应当返回NULLif(myctx==NULL)
{
/*必须在当前请求的内存池r->pool中分配上下文结构体, 这样请求结束时结构体占用的内存才会释放*/myctx = ngx_palloc(r->pool, sizeof(ngx_http_mytest_ctx_t));if(myctx=NULL)
{
return NGX_ERROR;
}
// 将刚分配的结构体设置到当前请求的上下文中ngx_http_set_ctx(r,myctx,ngx_http_mytest_module);
}
相关文章:
http的请求上下文
1.引入: 上下文是指HTTP框架为每个HTTP请求所准备的结构体。 HTTP框架定义的这个上下文是针对于HTTP请求的, 而且一个HTTP请求对应于每一个HTTP模块都可以有一个独立的上下文结构体(并不是一个请求的上下文由所有HTTP模块共用) 。…...

【MySQL】MySQL表的增删改查(进阶)
✨个人主页:bit me👇 ✨当前专栏:MySQL数据库👇 ✨算法专栏:算法基础👇 ✨每日一语:悟已往之不谏,知来者之可追。实迷途其未远,觉今是而昨非。 目 录🎄一. 数…...
C++ Primer Plus习题及答案-第十八章
习题选自:C Primer Plus(第六版) 内容仅供参考,如有错误,欢迎指正 ! C decltype和返回类型后置 左右值引用和移动语义 C11 新的类功能 C11 Lambda表达式 C11 包装器function 复习题 1. 使用用大括号括起的初始化列表语法重写下述代码。重写后…...
Redis事务控制
1.Redis事务控制的相关命令 命令名作用MULTI表示开始收集命令,后面所有命令都不是马上执行,而是加入到一个队列中。EXEC执行MULTI后面命令队列中的所有命令。DISCARD放弃执行队列中的命令。WATCH“观察“、”监控“一个KEY,在当前队列外的其…...
Springcloud OpenFeign 详解
一、概述OpenFeign是springcloud在Feign的基础上支持了SpringMVC的注解,整合了hystrix,同时,可以和Eureka和ribbon配合使用,如RequestMapping等等。OpenFeign的FeignClient可以解析SpringMVC的RequestMapping注解下的接口…...

软件测试期末
考原题就是爽 软件测试技术 知识点整理 https://wenku.baidu.com/view/524c900f4b2fb4daa58da0116c175f0e7cd11913.html 关键知识点 https://www.cnblogs.com/whylaughing/category/813559.html?page1 边界值法不选择无效数据 边界值分析法的基本思想 选取正好等于&am…...

关于Java的深拷贝和浅拷贝
文章目录1.拷贝的引入1.1引用拷贝1.2对象拷贝2.深拷贝与浅拷贝2.1浅拷贝2.2深拷贝1.拷贝的引入 1.1引用拷贝 创建一个指向对象的引用变量的拷贝 Teacher teacher new Teacher("Taylor",26); Teacher otherteacher teacher; System.out.println(teacher); System…...

固定值电阻的检测方法总结
🏡《总目录》 目录 1,概述2,测量方法3,检测方法3.1,读值3.2,测量3.3,排故4,总结1,概述 本文简单总结固定值电阻的测量与检查方法要点和注意事项。 2,测量方法 对于固定值电阻的测量来讲,直接将万用表红黑表笔分别插入到如下图所示的红色和黑色接线端。然后将万用表…...
打印机相关
打印机相关 打印机协议 ipp,printer-job-language,lpd协议。他们的默认端口分别是631,9100和515. printer-job-language(RAW协议) 9100端口的printer-job-language,又称为RAW协议。目前遇到的问题是,此端口发送数据,打印机直接打印,除非发送正确的printer-job-lan…...
入门力扣自学笔记235 C++ (题目编号:2347)
2347. 最好的扑克手牌 题目: 给你一个整数数组 ranks 和一个字符数组 suit 。你有 5 张扑克牌,第 i 张牌大小为 ranks[i] ,花色为 suits[i] 。 下述是从好到坏你可能持有的 手牌类型 : "Flush":同花&…...

k8s-二进制部署
文章目录一、环境二、步骤1、安装cfssl工具2、部署etcd集群3、在node节点安装docker组件4、安装flannel组件部署master节点组件部署node节点部署kube-proxy组件三、测试一、环境 角色服务器地址组件master192.168.174.140kube-apiserver,kube-controller-manager&a…...

前缀和差分(C/C++)
目录 1. 前缀和的定义 2. 一维前缀和 2.1 计算公式 2.2 用途 2.3 小试牛刀 3. 二维前缀和 3.1 用途 1. 前缀和的定义 对于一个给定的数列A,他的前缀和数中 S 中 S[ i ] 表示从第一个元素到第 i 个元素的总和。 如下图:绿色区域的和就是前缀和数组…...

回文子串的数量[寻找回文子串的完整思路过程]
寻找回文子串的完整思路过程前言一、回文串的数量二、动态规划1、完整思考过程2、go总结参考文献前言 回文字符串,就是从左遍历和从右遍历的字符是相同顺序的,转换一下,就是该字符串是对称的。寻找回文子串面临两个直接的问题,1-…...

CCNP350-401学习笔记(301-350题)
301、Drag and drop the virtual component from the left onto their descriptions on the right. 302、Which two actions, when applied in the LAN network segment, will facilitate Layer 3 CAPWAP discovery for lightweight AP? (Choose two.)A. Utilize DHCP option …...

【LeetCode】No.225. 用队列实现栈 -- Java Version
题目链接:https://leetcode.cn/problems/implement-stack-using-queues/ 1. 题目介绍(225. 用队列实现栈) 请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、t…...

45个写规范代码的小技巧
目录 1、规范命名 2、规范代码格式 3、写好代码注释 4、try catch 内部代码抽成一个方法 5、方法别太长 6、抽取重复代码 7、多用return 8、if条件表达式不要太复杂 9、优雅地参数校验 10、统一返回值 11、统一异常处理 12、尽量不传递null值 13、尽量不返回null值…...

MindFusion Diagramming for Java, 最新版 Crack
Diagramming for Java, V4.6.1 A unique Java Swing library for any type of flowchart.您需要的每一个图表功能 图表、方案、图形、网络、算法、树、图表 - 所有这些都是使用 MindFusion Diagramming for Java 工具快速轻松地构建的。结果令人着迷。 Java Dagram 库ÿ…...

中间件安全—Apache常见漏洞
中间件安全—Apache常见漏洞1.Apache常见漏洞1.1.Apache介绍1.2.Apache HTTPD 换行解析漏洞(CVE-2017-15715)1.2.1.漏洞介绍1.2.2.漏洞环境1.2.2.1.运行漏洞环境1.2.2.2.访问漏洞环境1.2.3.漏洞复现1.2.3.1.拦截1.2.3.2.添加换行1.2.3.3.访问文件1.3.Apa…...

Spring IOC 容器 Bean 加载过程
Spring IOC 容器 Bean 加载过程 Spring 对于我们所有的类对象进行了统一抽象,抽象为 BeanDefinition ,即 Bean 的定义,其中定义了类的全限定类名、加载机制、初始化方式、作用域等信息,用于对我们要自动装配的类进行生成。 Sprin…...
【DRF】Django Rest Framework(5.DRF中的通用视图类-GenericAPIView方法说明与使用说明)
1. GenericAPIView [通用视图类],概述 继承自 APIView增加了操作序列化器和数据库查询的方法,作用是为下面Mixin扩展类的执行提供方法支持。通常在使用时,可搭配一个或者多个Mixin扩展类源码 当我们查看 GenericAPIView 的源码时,…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...

家政维修平台实战20:权限设计
目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系,主要是分成几个表,用户表我们是记录用户的基础信息,包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题,不同的角色…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...