actix http消息处理源码剖析
之前的文章中我们小小地剖析了一下actix中websocket的处理流程:actix websocket消息处理流程源码剖析_聆听--风雨的博客-CSDN博客_actix
本文以官方示例https://github.com/actix/examples/blob/master/basics/hello-world/src/main.rs入手,剖析一下http消息的处理流程。
main函数很简单,就是实例化一个 HttpServer然后bind一个地址,然后run
bind 可以接受多个地址,里面做了socket的listen操作,并且为每个socket对应一个StreamNewService
actix-server --> builder.rs -->listen
HttpServer.run里面是将上一步的socket开始accept:
actix-server --> server.rs -->ServerInner --> run_async
Accept::start里做了两件事情:【1】根据线程数配置开启多个ServerWorker【2】开一个线程不断的poll socket,也就是接收链接。
actix-server --> accept.rs -->start
先来看poll_with,里面就是不断的建立链接,然后采用某种负载均衡策略,均衡地将链接send到各个worker中。
actix-server -->accept.rs --> poll_with
actix-server -->accept.rs --> accept
actix-server -->accept.rs --> accept_one
再回过头来worker里做了什么。woker里就是开启一个线程,然后不断的poll自己。
actix-server -->worker.rs -->start
woker的poll方法里就是recv到链接,然后将链接作为参数call到service中。
actix-server --> worker.rs -->poll
虽然这里的service还不是HttpService,但是经过层层的call,这些参数就会call到HttpService
HttpService的call方法中会根据不同的协议new不同的HttpServiceHandlerResponse,HttpServiceHandlerResponse时一个future可以被wait,即可以被poll。这里以http1为例:实际上就是把各种参数传递给了Dispatcher。而后,所有这个链接上的读数据-->处理数据-->返回数据都是再Dispatcher中做的。
我们看dispatcher中的poll方法,里面会不断地从链接中读取数据,编码成请求,处理请求,得到响应,再编码响应,再发送响应。其中从io上读写数据都是由缓存的,目前版本读缓存为128k,写缓存为32k。
官方的这张图也清晰地描述了http消息处理的流程。结合流程图再看代码会更容易些。
参考: HTTP Server Initializationhttps://actix.rs/docs/http_server_init/
总结:actix的代码难读主要是里面运用了大量的future和stream,如果对异步不熟悉的话,里面poll来poll去的逻辑的确是比较难看懂的。
actix http消息处理源码剖析相关推荐
- Chrome源码剖析
转自http://www.wy182000.com/2011/05/06/chrome%E6%BA%90%E7%A0%81%E5%89%96%E6%9E%90/ 开源是口好东西,它让这个充斥着大量工业 ...
- Google Chrome源码剖析
http://www.ha97.com/2903.html Google Chrome源码剖析[序] 发表于: Google, Google Chrome, 开源世界, 旧文存档, 编程开发 | 作者 ...
- Chrome-Chrome源码剖析
Chrome源码剖析 [序] && [一] [序] 开源是口好东西,它让这个充斥着大量工业垃圾代码和教材玩具代码的行业,多了一些艺术气息和美的潜质.它使得每个人,无论你来自米国纽约还是 ...
- 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...
老李推荐:第14章4节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中, ...
- JS魔法堂:mmDeferred源码剖析
一.前言 avalon.js的影响力愈发强劲,而作为子模块之一的mmDeferred必然成为异步调用模式学习之旅的又一站呢!本文将记录我对mmDeferred的认识,若有纰漏请各位指正,谢谢.项目请见 ...
- Kafka源码剖析 —— 网络I/O篇 —— 浅析KafkaSelector
为什么80%的码农都做不了架构师?>>> ##NioSelector和KafkaSelector有什么区别? 先说结论,KafkaSelector(org.apache.kaf ...
- Mongoose源码剖析:Introduction and Installation
引言 要剖析Mongoose的源码,首先你得知道它的一些基本情况和特性.并去使用它.本文就是介绍Mongoose是个什么东西?及如何安装和使用?这里假设你知道什么web服务器软件.web服务器使用什么 ...
- 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...
老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionPro ...
- 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1...
老李推荐:第3章3节<MonkeyRunner源码剖析>脚本编写示例: MonkeyImage API使用示例 在上一节的第一个"增加日记"的示例中,我们并没有看到日记 ...
最新文章
- 用计算机问你叫什么名字,计算器女友与男子谈情说爱 一分钟发出各种甜言蜜语...
- 趣学python3(32)-enumerate,zip
- keycode对应主要键的关系
- W3C近期要闻:与Mozilla MDN合作联合开发Web平台文档
- 页面用ajax实现简单的连接数据库
- 构建高并发高可用的电商平台架构实践 转载
- 学习使用 Go 的反射
- 【scrapy】学习Scrapy入门
- DataGrid 首次进入页面时,不要加载任何数据
- RabbitMQ(3) Spring boot集成RabbitMQ
- python3 写入excel_python3读取、写入、追加写入excel文件
- Mac 安装和配置 Maven
- MIDI通信协议-数据字节:GM1旋律乐器音色库(带中文名称)
- 【毕设论文——必修篇】论文撰写-宝藏工具网址
- 实验2《词法分析程序设计与实现》(C语言版)
- vue中的路由及自定义图标
- 计算机上显示找不到无线网络连接,笔记本没有无线网络连接怎么办 解决方法介绍【图解】...
- android 视频、图片混合轮播控件zbanner
- vdi转vmdk VirtualBox与VMware硬盘格式转换及使用方法
- TIM/QQ——将群文件中的临时文件转换成永久文件的方法