博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Fasthttp源码分析之http server源码分析
阅读量:4031 次
发布时间:2019-05-24

本文共 1137 字,大约阅读时间需要 3 分钟。

本文公众号文章链接:

本文csdn博客链接:

Fasthttp源码分析之http server源码分析

Fasthttp是比标准库net/http还要快的http库。今天研究了下它http server的源码。

 

源码路径为:github.com/valyala/fasthttp

源码目录见文章最后。(因为目录太长,故放最后)

 

 

一、Server

先看下常规的实例用法。以下是README.md中的代码

 

那么就根据入口,进行源码跟踪。

github.com/valyala/fasthttp/server.go

 

 

继续跟踪Server结构体

 

上面看到了入口的Handler的定义

 

Server最后的成员来看,用了很多的资源池,这是其性能高的重要原因之一。

 

我们继续跟踪,Server函数

 

里面有两个很重要的地方。第一个红框中,有一个workerpool,这个就是其于总不同的地方。

其中有一个最重要的东西,就是s.serverConn。因为workerpool最后进入工作的函数就是它。

 

构建好workerpool之后,就启动了accept,并将其放入workerpool中进行工作。


在这里我们先直接进入到s.serverConn

 

关键代码如图中。在函数中,准备好了ctx之后,最终调用的是Handler。这个就是用户设置的Handler

到此逻辑已经终结了。

 

二、workerpool

分析完逻辑过程后,我们重点看看workerpool

github.com/valyala/fasthttp/workerpool.go

 

其中最重要的是WorkerFunc。这个是传入进行的任务。

还有一个最重要的是ready,它的类型为workerChan

 

workerChan里面保存了最后使用时间和传参用的net.Conn

 

根据流程逻辑,看看Start函数

 

这个函数,其实很简单,定时调用了clean,清理过期空闲的worker

 

clean代码就不过多解释了。

 

继续跟踪流程逻辑

 

Server函数,可以看到,获取workerChan,并将连接发送到chan

 

上面的代码中分为了两个部分,一个为从现有的worker重寻找空闲的进行发送c

如果没找到,则要看是否达到了上限有个标志位createWorker。如果没有达到上限,

则从workerChanPoolGet新的,

并开启了协程,执行wp.workerFunc

 

最后我们看看workerFunc函数,其实就是调用了wp.WorkerFunc。这个就是之前提到的工作任务。

 

 

 

龚浩华

月牙寂道长

QQ 29185807

20180326

 第一时间获取文章,可以关注本人公众号:月牙寂道长,也可以扫码关注

 

 

 

源码目录:

 

 

 

 

你可能感兴趣的文章
RocketMQ的十二个特性,你都知道吗「下」
查看>>
一文搞懂RocketMQ最常见的16个基本概念
查看>>
Intellij IDEA启动优化,让开发的感觉飞起来
查看>>
玩转Java高并发?请先说明下并发下的惊群效应
查看>>
轻松搭建Redis 5.0集群环境,只需十分钟
查看>>
Jmeter压测错误,Address already in use: connect
查看>>
高并发API网关,Spring Cloud Gateway 之限流操作
查看>>
OAuth2.0 微服务认证授权,四种常见的授权模式
查看>>
Java 2019 面试宝典
查看>>
Redis面试题之持久化和五种部署方式
查看>>
搞定Spring Cloud断路器组件 Hystrix 的舱壁模式
查看>>
mybatis之大于、小于、大于等于和小于等于的写法
查看>>
如何实现 Oracle 的自增序列,两步轻松搞定
查看>>
不要等到Oracle磁盘空间满了,再去查表空间使用情况
查看>>
Hive SQL常用命令总结,大数据开发人员按需收藏
查看>>
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/io/IOUtils
查看>>
使用 Springboot 对 Kettle 进行调度开发
查看>>
Kettle链接MySQL报错:Driver class 'org.gjt.mm.mysql.Driver' could not be found
查看>>
Python的Turtle库非常实用,绘制图形竟然这么简单
查看>>
JVM面试要点:G1 垃圾收集器和如何做到可预测的停顿
查看>>