【长文梳理Webserver核心】框架篇

news2024/12/22 19:53:54

感谢前人的总结,让一个小白快速成长,那我也贡献一份自己的力量~

  • 大框架梳理
  • 从main函数开始学习

在这里插入图片描述

大框架梳理

先摆图:
在这里插入图片描述
目光先放到最上面的两个小框架,半同步/半反应堆线程池和异步日志系统,日志系统晓得伐?非常重要但不属于项目业务实现的核心,所以咱先主要看这个半同步/反应堆线程池,它在其中维护了一个请求队列,这个队列非常非常重要,主要用来处理请求(废话。。。

在这个线程池中的主线程通过epoll来监听socket,看有没有新请求,并将请求队列中的任务分配给线程池中的工作线程,OK到下一个绿框框了,工作线程可以处理的任务有三类:

  • 日志输出
  • 定时器处理非活动连接
  • 处理HTTP请求

以上就是文字描述的核心业务,如果更加清晰简单描述的话就是下面这样:
在这里插入图片描述
MainReactor将与Client建立的连接发给Acceptor,Acceptor再将连接分配给一些SubReactor的模块,在SubReactor中对具体的连接进行读、编码、计算、解码和写操作(即对client请求的响应)。

上面这句话是我抄的,有没有和我一样看这句话也会冒出很多问题的朋友?
比如,什么是SubReactor,为什么图片上只画了两个,建立什么样的具体连接…

我直接说了,冒出这种问题是因为前置知识不足
这里用的是主从Reactor多线程,图其实画的…我不知道为什么会一传十十传百,我查资料之后感觉有写问题,如果不对还请评论指出在这里插入图片描述下面以我查完资料的思路讲解一下:

我认为正确的图,来源看水印:
在这里插入图片描述
Reactor多线程方案说明:

  • 主Reactor通过Selector监听连接事件,收到通知后。通过Acceptor处理连接事件
  • 当Acceptor处理连接事件之后,MainReactor将事件分配给SubReactor
  • SubReactor将这个事件加入到队列中,并且创建Handler去处理
  • Handler对事件分发到Worker线程池并且进行处理
  • 主Reactor可以对应多个子Reactor

该方案的优点是:

  • 父线程与子线程的数据交互简单职责明确,父线程只负责接收新连接,子线程完成后续的业务处理
  • 父线程与子线程的数据交互简单,Reactor主线程只需要把新连接传给子线程,子线程无需返回数据

现在再看框架就明白多了
框架就了解到这里吧,接下来梳理一下细节

从main函数开始学习

作者在main函数中进行了参数配置,设置日志的相关参数(存储路径、日志等级…),然后实例化了一个主循环对象,初始化了Webserver单例对象,最后启动了Webserver并开启了主循环。

EventLoop mainLoop;
Server myHTTPServer(&mainLoop, threadNum, port);
myHTTPServer.start();
mainLoop.loop();

其中最重要的函数是myHTTPServer.start();mainLoop.loop();,先着重分析他俩

先看第一个函数myHTTPServer.start();
在这里插入图片描述
主要工作:

  • 启动线程池
  • 设置了acceptChannel_的handler,分别为读回调和连接回调
  • 将acceptChannel_加入Poller

可以看出来是做了一些连接操作,但什么是Poller?什么是acceptChannel_?
现在很多还不好解释,我先解释一下acceptChannel_的读回调函数,读回调函数就是有新连接时执行的函数
在这里插入图片描述
他的主要工作是:

  • 通过accept(3)来建立TCP连接
  • 从线程池中获取一个eventLoop事件循环
  • 将建立的新连接放入eventLoop事件循环

再看下mainLoop.loop();
在这里插入图片描述
做了以下工作:

  • 从poller中取出所有活动事件
  • 调用活动事件的回调函数
  • 执行额外的函数
  • 执行超时的回调函数

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

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

相关文章

jvm垃圾收集器简介

串行垃圾收集器 串行垃圾收集器,是指使用单线程进行垃圾回收,垃圾回收时,只有一个线程在工作,Java应用中的所有线程都要暂停,等待垃圾回收的完成。这种现象称之为STW(Stop-The-World),一般的javaweb应用中…

深入理解 pnpm(Performant NPM) 的实现原理及其与 npm 的区别

深入理解 pnpm 的实现原理及其与 npm 的区别 在 JavaScript 生态系统中,包管理器是开发者日常工作中不可或缺的工具。npm(Node Package Manager)作为 Node.js 的默认包管理器,已经广泛应用于各种项目中。然而,随着项目…

略谈发展测量方法论-高敏雪老师的文章解读与收获

历史地看, GDP 被誉为“世纪性发明”,我们曾经将其视为衡量一国经济发展的重要工具;现实地看,“超越 GDP”是当前出现的带有国际性的口号,内在地包含着对 GDP作为发展指标的批评和替代。 如何看到发展? 如…

apisix云原生网关

定义 企业级网关通过域名、路由将请求分发到对应的应用上,通常承载数千个服务的流量,对稳定性有较高要求。 CNCF全景图 选型 Kubernetes抽象出两个核心概念:Service,为多个Pod提供统一的访问入口;Ingress&#xff…

【STM32-HAL库】实现微秒、毫秒、纳秒延时。(STM32F4系列)(附带工程下载链接)

使用了本代码后不能使用HAL库自带的HAL_Delay函数 使用了本代码后不能使用HAL库自带的HAL_Delay函数 使用了本代码后不能使用HAL库自带的HAL_Delay函数 一、新建工程 可以参考我的新建工程系列教程 stm32-HAL库cubeMX新建工程教程(以F103C8T6为例)ht…

【长文梳理webserver核心】核心类篇

前言 有三个核心组件支撑一个reactor实现 [持续] 的 [监听] 一组fd,并根据每个fd上发生的事件 [调用] 相应的处理函数。这三个组件就是 EventLoop 、Channel 以及 Poller 三个类,其中 EventLoop 可以看作是对业务线程的封装,而 Channel 可以看…

从零开始搭建一个node.js后端服务项目

一、下载node.js及配置环境 网上很多安装教程,此处就不再赘述了 版本信息 C:\Users\XXX>node -v v20.15.0C:\Users\XXX>npm -v 10.7.0 二、搭建node.js项目及安装express框架 在任意位置创建一个项目文件夹,此处项目文件夹名为test&#xff0…

右键菜单添加cmd

regedit 计算机\HKEY_CLASSES_ROOT\Directory\Background\shell\命令提示符\command 数据:cmd.exe /s /k title 命令提示符 或软件商店安装 Windows Terminal

基于element-ui的upload组件与阿里云oss对象存储的文件上传(采用服务端签名后直传的方式)

服务端签名后直传图解 步骤 1 开通阿里云OSS对象存储服务&#xff0c;创建新的Bucket 2 创建子账户获取密钥 创建用户 添加权限 后端 1 新建一个第三方服务的模块 third-party pom文件 <?xml version"1.0" encoding"UTF-8"?> <project x…

HAL+M4学习记录_3

一、HAL库开发框架 记录HAL学习过程 1.1 CMSIS CMSIS&#xff08;Cortex微控制器软件接口标准&#xff09;&#xff0c;用于提供用户和硬件间的接口&#xff0c;用户通过CMSIS标准对Cortex微控制器内部寄存器单元进行读写 1.2 HAL库 HAL&#xff08;硬件抽象层&#xff09;为…

加固与脱壳04 - 一些简单的脱壳方法

这里只讨论一些简单壳的脱壳方法及其原因。 FRIDA-DEXDump https://github.com/hluwa/FRIDA-DEXDump 适用于不需要研究那些被强保护起来的代码&#xff0c;只是想单纯的看看某个地方的业务逻辑。 原理&#xff1a; 对于完整的 dex&#xff0c;采用暴力搜索 dex035&#xf…

云栖实录 | Hologres3.0全新升级:一体化实时湖仓平台

本文根据2024云栖大会实录整理而成&#xff0c;演讲信息如下&#xff1a; 演讲人&#xff1a; 姜伟华 | 阿里云智能集团资深技术专家、Hologres 负责人 丁 烨 | 阿里云智能集团产品专家、Hologres 产品负责人 活动&#xff1a; 2024 云栖大会 - 商用大数据计算与分析平台论…

基于Arduino的超声波和舵机模块集成使用

一.超声波模块和舵机模块集成使用 超声波模块&#xff1a;HC-SR04舵机模块&#xff1a;SG90目的&#xff1a;通过Arduino UNO核心板控制舵机旋转到不同位置&#xff0c;同时获取不同位置超声波模块和障碍物间的距离&#xff0c;配合控制算法&#xff0c;进行基于超声波智能避障…

需求10——通过改一个小bug来学习如何定位问题

在浏览我之前完成的一些小需求时&#xff0c;我发现了一个非常有价值的需求。这个需求可以让我深入了解系统中关于故障上报的功能。通过完善这个需求&#xff0c;我能够全面掌握整个故障上报的流程。 这个需求主要是关于故障上报流程中出现的问题。当前的流程如下&#xff1a;…

ML 系列:机器学习和深度学习的深层次总结(16) — 提高 KNN 效率-使用 KD 树和球树实现更快的算法

一、说明 在机器学习系列的第 16 节&#xff0c;我们重点介绍了提高 K 最近邻 &#xff08;KNN&#xff09; 算法的效率&#xff0c;这是一种广泛用于分类和回归任务的方法。虽然 KNN 简单有效&#xff0c;但对于大型数据集来说&#xff0c;其计算成本可能会令人望而却步。为了…

基于SpringBoot问卷调查系统小程序【附源码】

基于SpringBoot问卷调查系统小程序 效果如下&#xff1a; 管理员登录界面 管理员功能界面 调查人管理界面 问卷调查管理界面 问卷题目管理界面 用户登录界面 APP首页界面 公告信息界面 研究背景 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&…

组织病理学图像中的再识别|文献速递--基于多模态-半监督深度学习的病理学诊断与病灶分割

Title 题目 Re-identification from histopathology images 组织病理学图像中的再识别 01 文献速递介绍 在光学显微镜下评估苏木精-伊红&#xff08;H&E&#xff09;染色切片是肿瘤病理诊断中的标准程序。随着全片扫描仪的出现&#xff0c;玻片切片可以被数字化为所谓…

怎么在单片机裸机程序中移植EasyLogger?

1、介绍 EasyLogger 是一款超轻量级、高性能的C日志库&#xff0c;非常适合对资源敏感的软件项目。例如&#xff1a;IoT产品、可穿戴设备、智能家居等等。相比log4c、zlog这些知名的C日志库&#xff0c;EasyLogger的功能更加简单&#xff0c;提供给用户的接口更少&#xff0c;但…

肺腺癌预后新指标:全切片图像中三级淋巴结构密度的自动化量化|文献精析·24-10-09

小罗碎碎念 本期这篇文章&#xff0c;我去年分享过一次。当时发表在知乎上&#xff0c;没有标记参考文献&#xff0c;配图的清晰度也不够&#xff0c;并且分析的还不透彻&#xff0c;所以趁着国庆假期重新分析一下。 这篇文章的标题为《Computerized tertiary lymphoid structu…

基于springboot vue 校园失物招领平台的设计与实现

博主介绍&#xff1a;专注于Java&#xff08;springboot ssm springcloud等开发框架&#xff09; vue .net php phython node.js uniapp小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作☆☆☆ 精彩专栏推荐订阅☆☆☆☆…