源码学习-net/http

本文深入探讨Go语言标准库net/http,通过分析源码揭示HTTP服务器的实现原理。从最简单的HTTP服务器开始,讲解Handler、路由、net包、并发处理等方面,展示了Go语言如何优雅地构建和管理HTTP服务。
摘要由CSDN通过智能技术生成

package net/http是Go语言的主要应用场景之一web应用的基础,从中可以学习到大量前文提到的io,以及没有提到的sync包等一系列基础包的知识,代码量也相对较多,是一个源码学习的宝库。本文主要从一个http server开始,讲解Go是如何实现一个http协议服务器的。

主要涉及以下源码文件:
net/net.go
net/server.go
net/http.go
net/transfer.go
sync/pool.go
sync/mutex.go

0.引子:从最简单的http server说起

func main() {
    http.HandleFunc("/hi", hi)
    http.ListenAndServe(":9999", nil)
    fmt.Printf("hello, world\n")
}

func hi(res http.ResponseWriter, req *http.Request) {
    fmt.Fprintf(res, "hi")
}

以上就是最简单的服务器代码,运行后监听本机的9999端口,在浏览器中打开http://localhost:9999可以看到返回的hi,接下来就从此入手,开始分析net/http模块。

1.Handler: 从路由开始上路
先来分析http.HandleFunc("/hi", hi) 这一句,查看源码发现:

func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    DefaultServeMux.HandleFunc(pattern, handler)
}

首先我们了解到handler的定义是这样的func(ResponseWriter, *Request)。这个定义很关键,先提一下。
然后看到了DefaultServeMux,这个类是来自于ServeMux结构的一个实例,而后者是一个『路由器』的角色,在后面讲到的请求处理过程中,ServeMux用来匹配请求的地址,分配适合的handler来完成业务逻辑。
完整的来讲,我们应该先定义一个自己的ServeMux,并向他分配路由,像这样:

mux := http.NewServeMux()
mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {
    fmt.Fprintf(w, "Welcome to the home page!")
})
http.ListenAndServe(":9999", mux)

1.生成一个路由器
2.向路由器注册路由
3.由路由器以及服务地址建立底层连接并提供服务

而之前的简写方式只是省略了建立路由的过程,实际上用了系统自带的DefaultServeMux作为路由器而已。

2.向net包匆匆一瞥:一切的基础在net.Conn
接下来看到http.ListenAndServe(":9999", nil)这句代码的源码。

func ListenAndServe(addr string, handler Handler) error {
    server := &Server{Addr: addr, Handler: handler}
    return server.ListenAndServe()
}

首先生成了一个server对象,并调用了它的ListenAndServe方法。Server对象顾名思义,封装了有关提供web服务相关的所有信息,是一个比较重要的类。

// A Server defines parameters for running an HTTP server.
// The zero value for Server is a valid configuration.
type Server struct {
    Addr         string        // TCP address to listen on, ":http" if empty
    Handler      Handler       // handler to invoke, http.DefaultServeMux if nil
    ReadTimeout  time.Duration // maximum duration before timing out read of the request
    WriteTimeout time.Duration // maximum duration before timing out write of the response
    TLSConfig    *tls.Config   // optional TLS config, used by ListenAndServeTLS

    MaxHeaderBytes int

    TLSNextProto map[string]func(*Server, *tls.Conn, Handler)

    ConnState func(net.Conn, ConnState)

    ErrorLog *log.Logger

    disableKeepAlives int32     // accessed atomically.
    nextProtoOnce     sync.Once // guards setupHTTP2_* init
    nextProtoErr      error     // result of http2.ConfigureServer if used
}

1.handler即路由器(实际上路由器本身作为handler,其中有注册了很多handler),见Handler定义:

type Handler interface {
    ServeHTTP(ResponseWri
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值