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

Posted 月牙寂道长

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Fasthttp源码分析之http server源码分析相关的知识,希望对你有一定的参考价值。

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

 

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

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



一、Server

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

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


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

github.com/valyala/fasthttp/server.go

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

继续跟踪Server结构体

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

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


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

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


我们继续跟踪,Server函数

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

里面有两个很重要的地方。第一个红框中,有一个workerpool,这个就是其于总不同的地方。其中有一个最重要的东西,就是s.serverConn。因为workerpool最后进入工作的函数就是它。

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

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


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

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

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

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

到此逻辑已经终结了。


二、workerpool

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

github.com/valyala/fasthttp/workerpool.go

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

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

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

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

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


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

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

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


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

clean代码就不过多解释了。


继续跟踪流程逻辑

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

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


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

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

如果没找到,则要看是否达到了上限有个标志位createWorker。如果没有达到上限,则从workerChanPool中Get新的,并开启了协程,执行wp.worker

Func。


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

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




龚浩华

月牙寂道长

QQ 29185807

2018年03月26日

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




源码目录:



以上是关于Fasthttp源码分析之http server源码分析的主要内容,如果未能解决你的问题,请参考以下文章

golang-net/http源码分析之http server

archaius源码分析之配置源

archaius源码分析之概述

iOS底层探索之多线程—GCD源码分析(事件源dispatch_source)

[golang] fasthttp 使用http代理

Django源码分析之server