之前的文章中我们小小地剖析了一下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消息处理源码剖析相关推荐

  1. Chrome源码剖析

    转自http://www.wy182000.com/2011/05/06/chrome%E6%BA%90%E7%A0%81%E5%89%96%E6%9E%90/ 开源是口好东西,它让这个充斥着大量工业 ...

  2. Google Chrome源码剖析

    http://www.ha97.com/2903.html Google Chrome源码剖析[序] 发表于: Google, Google Chrome, 开源世界, 旧文存档, 编程开发 | 作者 ...

  3. Chrome-Chrome源码剖析

    Chrome源码剖析 [序] && [一] [序] 开源是口好东西,它让这个充斥着大量工业垃圾代码和教材玩具代码的行业,多了一些艺术气息和美的潜质.它使得每个人,无论你来自米国纽约还是 ...

  4. 老李推荐:第14章4节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-装备ViewServer-端口转发 1...

    老李推荐:第14章4节<MonkeyRunner源码剖析> HierarchyViewer实现原理-装备ViewServer-端口转发 在初始化HierarchyViewer的实例过程中, ...

  5. JS魔法堂:mmDeferred源码剖析

    一.前言 avalon.js的影响力愈发强劲,而作为子模块之一的mmDeferred必然成为异步调用模式学习之旅的又一站呢!本文将记录我对mmDeferred的认识,若有纰漏请各位指正,谢谢.项目请见 ...

  6. Kafka源码剖析 —— 网络I/O篇 —— 浅析KafkaSelector

    为什么80%的码农都做不了架构师?>>>    ##NioSelector和KafkaSelector有什么区别? 先说结论,KafkaSelector(org.apache.kaf ...

  7. Mongoose源码剖析:Introduction and Installation

    引言 要剖析Mongoose的源码,首先你得知道它的一些基本情况和特性.并去使用它.本文就是介绍Mongoose是个什么东西?及如何安装和使用?这里假设你知道什么web服务器软件.web服务器使用什么 ...

  8. 老李推荐:第5章5节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 获取系统服务引用 1...

    老李推荐:第5章5节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 获取系统服务引用 上一节我们描述了monkey的命令处理入口函数run是如何调用optionPro ...

  9. 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1...

    老李推荐:第3章3节<MonkeyRunner源码剖析>脚本编写示例: MonkeyImage API使用示例 在上一节的第一个"增加日记"的示例中,我们并没有看到日记 ...

最新文章

  1. 用计算机问你叫什么名字,计算器女友与男子谈情说爱 一分钟发出各种甜言蜜语...
  2. 趣学python3(32)-enumerate,zip
  3. keycode对应主要键的关系
  4. W3C近期要闻:与Mozilla MDN合作联合开发Web平台文档
  5. 页面用ajax实现简单的连接数据库
  6. 构建高并发高可用的电商平台架构实践 转载
  7. 学习使用 Go 的反射
  8. 【scrapy】学习Scrapy入门
  9. DataGrid 首次进入页面时,不要加载任何数据
  10. RabbitMQ(3) Spring boot集成RabbitMQ
  11. python3 写入excel_python3读取、写入、追加写入excel文件
  12. Mac 安装和配置 Maven
  13. MIDI通信协议-数据字节:GM1旋律乐器音色库(带中文名称)
  14. 【毕设论文——必修篇】论文撰写-宝藏工具网址
  15. 实验2《词法分析程序设计与实现》(C语言版)
  16. vue中的路由及自定义图标
  17. 计算机上显示找不到无线网络连接,笔记本没有无线网络连接怎么办 解决方法介绍【图解】...
  18. android 视频、图片混合轮播控件zbanner
  19. vdi转vmdk VirtualBox与VMware硬盘格式转换及使用方法
  20. TIM/QQ——将群文件中的临时文件转换成永久文件的方法

热门文章

  1. SCI 文章被拒是一种怎样的体验? - 易智编译EaseEditing
  2. 上周听SMARTCLIENT讲座感受
  3. 关于Linux下C语言开发基础的实验内容。
  4. TCP/IP的三次握手
  5. 挖掘肖特基二极管结构符号及其特性曲线图
  6. 人工智能与大数据—线性回归之波士顿房价预测
  7. 漏斗算法和令牌桶算法
  8. WiFi设备的区域性要求
  9. 什么样的网站可以用Joomla搭建
  10. 漫谈程序员系列:程序员的生活就这样吗