源码分析golang http shutdown优雅退出的原理

前言:

我们知道在go 1.8.x后,golang在http里加入了shutdown方法,用来控制优雅退出。什么是优雅退出? 简单说就是不处理新请求,但是会处理正在进行的请求,把旧请求都处理完,也就是都response之后,那么就退出。

社区里不少http graceful动态重启,平滑重启的库,大多是基于http.shutdown做的。平滑启动的原理很简单,fork子进程,继承listen fd, 老进程优雅退出。以前写过文章专门讲述在golang里如何实现平滑重启 (graceful reload)。有兴趣的朋友可以翻翻。

该文章后续仍在不断的更新修改中, 请移步到原文地址  http://xiaorui.cc/?p=5803

http shutdown 源码分析

先来看下http shutdown的主方法实现逻辑。用atomic来做退出标记的状态,然后关闭各种的资源,然后一直阻塞的等待无空闲连接,每500ms轮询一次。

关闭server.doneChan和监听的文件描述符

这么一系列的操作后,server.go的serv主监听方法也就退出了。

那么如何保证用户在请求完成后,再关闭连接的?

总结:

总觉得golang net/http的代码写得有点乱,应该能写得更好。我也看过不少golang标准库的源代码,最让我头疼的就是net/http了。😅


大家觉得文章对你有些作用! 如果想赏钱,可以用微信扫描下面的二维码,感谢!
另外再次标注博客原地址  xiaorui.cc