Fasthttp源码分析之http server源码分析
Posted 月牙寂道长
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。如果没有达到上限,则从workerChanPool中Get新的,并开启了协程,执行wp.worker
Func。
最后我们看看workerFunc函数,其实就是调用了wp.WorkerFunc。这个就是之前提到的工作任务。
龚浩华
月牙寂道长
QQ 29185807
2018年03月26日
源码目录:
以上是关于Fasthttp源码分析之http server源码分析的主要内容,如果未能解决你的问题,请参考以下文章
golang-net/http源码分析之http server