讲透Golang标准库net/http实现原理 — 服务端
讲透Golang标准库net/http实现原理
IT袋网网为大家说一说讲透Golang标准库net/http实现原理的方法内容,具体详情如下:
今天分享下Go语言net/http标准库的内部实现逻辑,文章将从客户端(Client)–服务端(Server)两个方向作为切入点,进而一步步分析http标准库内部是如何运作的。

由于会涉及到不少的代码流程的走读,写完后觉得放在一篇文章中会过于长,可能在阅读感受上会不算很好,因此分为【Server–Client两个篇文章】进行发布。
本文内容是【服务端Server部分】,文章代码版本是Golang 1.19,文中会涉及较多的代码,需要耐心阅读,不过我会在尽量将注释也逻辑阐述清楚。
Go 语言的 net/http 中同时封装好了 HTTP 客户端和服务端的实现,这里分别举一个简单的使用示例。
Server启动示例
Server和Client端的代码实现来自net/http标准库的文档,都是简单的使用,而且用很少的代码就可以启动一个服务!
http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "xiaoxu code")
})
http.ListenAndServe(":8080", nil)
上面代码中:
HandleFunc 方法注册了一个请求路径 /hello 的 handler 函数
ListenAndServe指定了8080端口进行监听和启动一个HTTP服务端
Client发送请求示例
HTTP 包一样可以发送请求,我们以Get方法来发起请求,这里同样也举一个简单例子:
resp, err := http.Get("http://example.com/")
if err != nil {
fmt.Println(err)
return
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
fmt.Println(string(body))
是不是感觉使用起来还是很简单的,短短几行代码就完成了http服务的启动和发送http请求,其背后是如何进行封装的,在接下的章节会讲清楚!
服务端 Server
我们先预览下图过程,对整个服务端做的事情有个了解

从图中大致可以看出主要有这些流程:
- 1.注册handler到map中,map的key是键值路由
- 2.handler注册完之后就开启循环监听,监听到一个连接就会异步创建一个 Goroutine
- 3.在创建好的 Goroutine 内部会循环的等待接收请求数据
- 4.接受到请求后,根据请求的地址去处理器路由表map中匹配对应的handler,然后执行handler
Server结构体
type Server struct {
Addr string
Handler Handler
mu sync.Mutex
ReadTimeout time.Duration
WriteTimeout time.Duration
IdleTimeout time.Duration
TLSConfig *tls.Config
ConnState func(net.Conn, ConnState)
activeConn map[*conn]struct{}
doneChan chan struct{}
listeners map[*net.Listener]struct{}
...
}
type Server struct {
Addr string
Handler Handler
mu sync.Mutex
ReadTimeout time.Duration
WriteTimeout time.Duration
IdleTimeout time.Duration
TLSConfig *tls.Config
ConnState func(net.Conn, ConnState)
activeConn map[*conn]struct{}
doneChan chan struct{}
listeners map[*net.Listener]struct{}
...
}我们在下图中解释了部分字段代表的意思

ServeMux结构体
type ServeMux struct {
mu sync.RWMutex
m map[string]muxEntry
es []muxEntry
hosts bool
}
type ServeMux struct {
mu sync.RWMutex
m map[string]muxEntry
es []muxEntry
hosts bool
}字段说明:
- • sync.RWMutex:这是读写互斥锁,允许goroutine 并发读取路由表,在修改路由map时独占
- • map[string]muxEntry:map结构维护pattern (路由) 到 handler (处理函数) 的映射关系,精准匹配
- •[]muxEntry:存储 “/” 结尾的路由,切片内按从最长到最短的顺序排列,用作模糊匹配patter的muxEntry
- • hosts:是否有任何模式包含主机名
Mux是【多路复用器】的意思,ServeMux就是服务端路由http请求的多路复用器。
相关阅读
-
如何启用OSPF TTL安全检查 启用OSPF TTL安全机制步骤
您可能不了解如何启用OSPF及TTL安全检查的电脑小知识,接下来IT袋网小编为大家介绍。 为了抵御TTL攻击,OSPF TTL 安全检查机制应运而生。 启用此功能后,OSPF将仅接受TTL为255的数据包,拒绝任
-
如何设计安全的API调用 设计安全API调用的最佳实践
小编带来的是如何设计安全的API调用方面的介绍,很不错的方法小知识,建议收藏哦! 如何为网站设计安全的API访问? 我们在设计一个网站或平台的时候,经常需要向用户开放API访问。 这样
-
如何设计安全可靠的API
如果想知道如何设计安全可靠的API方面的介绍,一起来看看吧! 如何设计安全可靠的API,下图列出了12条原则。 1、使用HTTPS 数据加密:HTTPS 对客户端和服务器之间传输的数据进行加密。它使用
-
MySQL 8.3有哪些新增和删减?
一篇关于MySQL的电脑小知识,下面为详细的介绍。 MySQL 8.3 主要更新:用于标记事务分组的 GTID、JSON EXPLAIN 格式增强、一些功能删除等。 MySQL是一款广泛使用的开源的关系型数据库管理系统,已


