IT袋

当前位置:主页 > 经验教程 > 建站编程 >

讲透Golang标准库net/http实现原理

讲透Golang标准库net/http实现原理 — 服务端

时间:2024-01-29 18:42:27 来源:IT袋 作者:马勇
导读:讲透Golang标准库net/http实现原理,IT袋网网为大家说一说讲透Golang标准库net/http实现原理的方法内容,具体详情如下: 今天分享下Go语言net/http标准库的内部实现逻辑,文章将从客户端(Client)服务端(Server)两

讲透Golang标准库net/http实现原理

IT袋网网为大家说一说讲透Golang标准库net/http实现原理的方法内容,具体详情如下:

今天分享下Go语言net/http标准库的内部实现逻辑,文章将从客户端(Client)–服务端(Server)两个方向作为切入点,进而一步步分析http标准库内部是如何运作的。

讲透Golang标准库net/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

我们先预览下图过程,对整个服务端做的事情有个了解

讲透Golang标准库net/http实现原理

从图中大致可以看出主要有这些流程:

  1. 1.注册handler到map中,map的key是键值路由
  2. 2.handler注册完之后就开启循环监听,监听到一个连接就会异步创建一个 Goroutine
  3. 3.在创建好的 Goroutine 内部会循环的等待接收请求数据
  4. 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{}
    ...
}

我们在下图中解释了部分字段代表的意思

讲透Golang标准库net/http实现原理

ServeMux结构体

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安全检查 启用OSPF TTL安全机制步骤

    您可能不了解如何启用OSPF及TTL安全检查的电脑小知识,接下来IT袋网小编为大家介绍。 为了抵御TTL攻击,OSPF TTL 安全检查机制应运而生。 启用此功能后,OSPF将仅接受TTL为255的数据包,拒绝任

  • 如何设计安全的API调用 设计安全API调用的最佳实践

    如何设计安全的API调用 设计安全API调用的最佳实践

    小编带来的是如何设计安全的API调用方面的介绍,很不错的方法小知识,建议收藏哦! 如何为网站设计安全的API访问? 我们在设计一个网站或平台的时候,经常需要向用户开放API访问。 这样

  • 如何设计安全可靠的API

    如何设计安全可靠的API

    如果想知道如何设计安全可靠的API方面的介绍,一起来看看吧! 如何设计安全可靠的API,下图列出了12条原则。 1、使用HTTPS 数据加密:HTTPS 对客户端和服务器之间传输的数据进行加密。它使用

  • MySQL 8.3有哪些新增和删减?

    MySQL 8.3有哪些新增和删减?

    一篇关于MySQL的电脑小知识,下面为详细的介绍。 MySQL 8.3 主要更新:用于标记事务分组的 GTID、JSON EXPLAIN 格式增强、一些功能删除等。 MySQL是一款广泛使用的开源的关系型数据库管理系统,已